質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

2555閲覧

Next.jsのAPIで文字化けしてしまう

goshieta

総合スコア0

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1グッド

0クリップ

投稿2023/03/24 03:47

前提

現在Next.js+Typescriptでアプリケーションを作成しています。その際Google検索した際に出てくるサジェストを取るAPIを作ろうと思い、apiディレクトリにsuggest.tsを作り、呼び出したところ、アプリケーション自体から呼び出した場合もブラウザ上から呼び出した場合も、日本語が文字化けしてしまいます。どのようにすれば文字化けが解消するでしょうか?
ソースコードは以下のとおりです。エラーは特に出ていません。またGoogleのAPIはXMLが返ってくる仕様だったので、node-html-parserを使用してXMLを解析しています。

該当のソースコード

typescript

1import { NextApiRequest, NextApiResponse } from "next"; 2import { parse } from 'node-html-parser'; 3 4export default async function postsuggest(req:NextApiRequest,res:NextApiResponse){ 5 const resXML=await fetch("http://www.google.com/complete/search?hl=ja&output=toolbar&q="+req.query.word,).then(res=>res.text()) 6 const root=parse(resXML) 7 const returnArray=root.querySelectorAll("suggestion").map((tag)=>tag.getAttribute("data")) 8 const returnString=returnArray.join(",") 9 10 res.status(200).send(JSON.stringify({wordList:returnString,test:"日本語テスト"}, null, 2)) 11}

youtubeと入力し出力させてみた例

( http://localhost:3000/api/suggest?word=youtube にアクセス)

json

1{ 2 "wordList": "youtube,youtube �ス_�スE�ス�ス�ス�ス�ス[�スh,youtube music,youtube mp3,youtube�スv�ス�ス�ス~�スA�ス�ス,youtube premium,youtube studio,youtube�ス�ス�ス�ス,youtube�スX�ス^�スW�スI,youtube �ス�ス�ス�スネゑソス", 3 "test": "譌・譛ャ隱槭ユ繧ケ繝�" 4}

このように、XMLの部分だけでなく、日本語をそのまま出力しているtestの部分も文字化けしています。

試したこと

調べたのですがわからなかったのでBingAIに聞き、10行目の部分を
「res.status(200).json({wordList:returnString,test:"日本語テスト"})」
から
「res.status(200).send(JSON.stringify({wordList:returnString,test:"日本語テスト"}, null, 2))」
に変えたのですが、特に意味はありませんでした。

使用している環境

OS : Ubuntu 22.04
ブラウザ : vivaldi 5.7.2921.63
Node.js : v18.15.0
npm : 9.5.0

y-temp4👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

文字化けの問題は、エンコーディングの設定が原因であることが多いです。

今回の場合、GoogleのAPIから返ってくるXMLのエンコーディングがおそらくUTF-8ではないため、文字化けが発生していると考えられます。まずは、GoogleのAPIから返ってくるXMLのエンコーディングをUTF-8に変換することを試みてみましょう。

iconv-liteというパッケージを使用して、エンコーディングを変換できます。

ts

1import { NextApiRequest, NextApiResponse } from "next"; 2import { parse } from "node-html-parser"; 3import iconv from "iconv-lite"; 4 5export default async function postsuggest( 6 req: NextApiRequest, 7 res: NextApiResponse 8) { 9 const response = await fetch( 10 "http://www.google.com/complete/search?hl=ja&output=toolbar&q=" + 11 req.query.word 12 ); 13 const buffer = await response.arrayBuffer(); 14 const decodedData = iconv.decode(Buffer.from(buffer), "Shift_JIS"); // エンコーディングをShift_JISからUTF-8に変換 15 const root = parse(decodedData); 16 const returnArray = root 17 .querySelectorAll("suggestion") 18 .map((tag) => tag.getAttribute("data")); 19 const returnString = returnArray.join(","); 20 21 res.setHeader("Content-Type", "application/json; charset=utf-8"); // 応答のContent-Typeを設定 22 res 23 .status(200) 24 .send( 25 JSON.stringify({ wordList: returnString, test: "日本語テスト" }, null, 2) 26 ); 27}

上記が修正例です。手元の環境では、これで正常に文字化けなく動作しました。

投稿2023/03/31 07:29

y-temp4

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問