cURLとutf-8:エンコードとデコードを解説
cURLを利用してAPIをテストする時に、たまに文字コードをUTF-8に指定する必要もあり、レスポンスで\uを先頭にされているUTF-8コードが表示されることがあります。このような場合、UTF-8文字コードのエンドコードとデコードが必要な作業になります。本文では、これらの対策について皆さんに紹介します。
UTF-8(Unicode Transformation Format - 8-bit)は、文字エンコーディングの一種で、Unicode文字集合を可変長で表現する形式です。UTF-8は、最も汎用性の高い文字コードとして、様々な領域で利用されています。cURLを利用してAPIをテストする時に、たまに文字コードをUTF-8に指定する必要もあり、レスポンスで\u
を先頭にされているUTF-8コードが表示されることがあります。このような場合、UTF-8文字コードのエンドコードとデコードが必要な作業になります。本文では、これらの対策について皆さんに紹介します。
cURLとUTF-8について
cURLはHTTP通信を扱うツールですが、リクエストやレスポンスのエンコードとしてUTF-8をデフォルトで想定しています。しかしながら、文字化けを防ぐためにいくつかのオプション設定が必要です。特にレスポンスデータの文字コード自動判定を無効化する-ascii
オプションが大切です。
また、POSTデータなどクライアントから送信するデータは適切にUTF-8でエンコードする必要があります。送信用のデータ変換には注意が必要です。
cURLでエンコーディングをUTF-8に設定
curlでUTF-8の文字を適切に扱うためには、主に以下の2つのことが重要です。
ステップ⒈リクエストのエンコーディングをUTF-8に設定する
curl -H "Content-Type: application/json; charset=utf-8" http://example.com
上記のようにヘッダーでcharset=utf-8を指定します。
ステップ⒉文字コードの自動検出を無効にする
curlはデフォルトでサーバーからのレスポンスの文字コードを自動検出しますが、検出した文字コードで表示されてしまうと文字化けすることがあります。
このため-ASCII
オプションを使用して自動検出を無効にし、レスポンスをUTF-8として扱うようにします。
curl -H "Content-Type: application/json" -H "Accept: application/json" -ASCII http://example.com
このように設定しておくことで、リクエスト、レスポンスともにUTF-8で適切に扱えるようになります。curlだけでなく、Unicodeをサポートしている他のツールとの組み合わせなどで、文字化けが発生する場合はこの2つの設定を確認することをおすすめします。
cURLで取得したUTF-8のレスポンスを日本語にデコード
また、cURLコマンドでリクエストを送信すると、取得するレスポンスが\u
を先頭にされているUTF-8コードが表示されることがあります。例えば、APIエンドポイントは政府統計の総合窓口(e-Stat)のAPIを例にします:
$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=error
このリクエストでは、appId値をerrorに設定するので、エラーメッセージが返してくるのが想定できますね。しかし、実際にcURLコマンドを使ってリクエストを送信すると、次のレスポンスが返されます:
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3ID\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002","DATE":"2023-12-04T16:20:46.399+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}%
参照元:https://qiita.com/ponsuke0531/items/9f798a9193a347266ff7
このように、元々読み解けるエラーメッセージのテキストが返されることを期待しますが、\u
から始めて全然理解できないUTF-8コードを変えてしまいましたね。このような場合はどうしたらいいですか?
Apidogでレスポンスを自動的にデコードする
一部のサーバーの設定により、返されたレスポンスのデータがUTF-8文字コードで表示されることがあります。このような場合は、どうやってそれを人間で読めるテキストに変換すればいいですか?実際には、curlでそんなに頑張らなくても良いのでしょう。
Apidogは、非常に使いやすいAPI管理ツールとして、UTF-8を含む様々な文字エンコーディングにも対応できます。つまり、レスポンスから返されるレスポンスは、UTF-8文字コードであっても、Apidogはそれを人間が理解できるテキストに自動変換できますので、非常に便利です。
同じく政府統計の総合窓口(e-Stat)のAPIを呼び出そうとします。
上記の写真が示すように、cURLで返されたレスポンスのUTF-8文字コードが全部綺麗な日本語になりました。
まとめ
Apidogは、APIのテストや管理を支援するツールで、とても使いやすいインターフェースを提供しています。中でも、UTF-8の文字コードへの対応が大きな特徴といえるでしょう。例えば、政府統計のAPIをcURLで呼び出した場合、しばしばレスポンスがUTF-8の文字コードで返ってきます。これは人間には理解できない文字列になってしまいます。ところが、Apidogを使えば、このUTF-8の文字列を自動的に適切な日本語の文字列に変換してくれるのです。
つまり、面倒な文字コードの変換を全てApidogに任せることができるわけです。cURL単体では文字化けに対処するのは大変ですが、Apidogを併用することで、とても簡単にUTF-8のデータを扱えるようになるのです。