• ベストアンサー

JSON形式の文字データの変換方法で悩んでいます。

JSON形式の文字データの変換方法で悩んでいます。 (WEB上のAPIを叩いて取得してきたデータです) 例えば、、、 \u30aa\u30c1\u30b2\u30fc\u30c6\u30ce\u30bb\u30eb この様な文字列です。 他のAPIで得られた文字データの場合、、、 Encode::from_to($name ,'utf8','sjis'); で問題なく日本語に変換できていたのですが、この形式の場合、全く変換されません。 上記の様な文字コードを日本語に変換するには、どうしたらよいのでしょう? 助言いただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

アホな方法で s/\\u([[:xdigit:]]{4})/chr eval "0x$1"/eg; みたいなのは考えられるけど, もっと賢い方法があると思う.

keeeeeeen
質問者

お礼

Tacosan様 助言、ありがとうございます。 >みたいなのは考えられるけど, もっと賢い方法があると思う. $name=~s/\\u([[:xdigit:]]{4})/chr eval "0x$1"/eg; や $name=~s/¥\u([[:xdigit:]]{4})/chr eval "0x$1"/eg; を試してみたのですが、今度は、何も表示されなくなりました。(^_^;) (たぶん、私のperlプログラムファイルを「日本語(MacOS)エンコーディング、改行タイプをMac(CR)」で保存している事あたりに原因がありそうなのですが、use utf8宣言をして「utf8エンコーディングとunix(LF)改行」で保存した上で動かすと、これまた、今度はプログラム結果が何も表示されなくなります) この様な状況の中、なんとか、UTF16の文字をSHIFTJIS文字へ変換する事はできないもんでしょうか?

keeeeeeen
質問者

補足

>今度は、何も表示されなくなりました。(^_^;) と思っていたのですが、、、、 ●プログラムファイル自体を「utf8エンコーディングとunix(LF)改行」で保存し直した後、さらに、 Encode::from_to($name ,'utf8','sjis'); を取り去ってみたところ、正常に動いた上に、見事に日本語として表示されました! (ありがとうございます!) ただ、上記の置換の場合、改行のみが取り残されていたので、、、 $name=~s/\\n/<br>/g; を付け加えたところ、完璧なものとなりました。 丸2日悩み続けていた問題が解決しました! ありがとうございます!! ただ、、、 >アホな方法で とあるのですが、この方法のどこが賢くないのでしょうか? (私は、この手法のどこが賢くないのか理解できる程、賢くありません(^_^;)) ご教授いただけると幸いです。 ※今回の教訓 ●Perlのソースは、はじめから「utf8エンコーディングとunix(LF)改行」で保存する事。  (今まで、デフォルトの設定で保存していて、問題が起きなかったため、つい、それをつづけていました。。。)

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「アホ」というか, 「かなり強引」な感じがするんですよ.... 「16進 4桁の文字列が与えられたときに, それをコードポイントとする文字にする」ってのはそれなりにありそうな気がするんだけど, やってることが単純なわりに eval とか s///eg とかの強引な手段を使ってるというのが気にいらない. pack なり unpack なりが使えればシンプルでいいんだけど, よくわからなかった.

keeeeeeen
質問者

お礼

>pack なり unpack なりが使えればシンプルでいいんだけど, よくわからなかった. 私もpackやunpack、その他、複数のモジュールを試したのですが、何故かうまくいかず、Tacosanさんの手法で、はじめてうまくいきました。 Tacosanさんの手法を教えていただかなかったら、たぶん、あと1週間は悩んでいたと思います。(^_^;) 重ね重ね、ありがとうございました! P.S. 私の環境では、うまく稼働しなかった参考にしたサイトを、とりあえず、書き記しておきます。 ●Unicode::Japanese::JA http://search.cpan.org/~hio/Unicode-Japanese-0.47/lib/Unicode/Japanese/JA.pod ●Unicodeデコーダ「simaguni.pl」 http://www2.famille.ne.jp/~akio1998/simaguni.html ●unpack や use Encode qw( from_to ); http://oshiete.goo.ne.jp/qa/4186293.html

回答No.1

UTF-16の文字列のようの見えますね。UTF-16で読むと 「オチゲーテノセル」?? $ cat tmp.txt | nkf -w オチゲーテノセル $ file tmp.txt tmp.txt: Big-endian UTF-16 Unicode character data $ od -txC tmp.txt 0000000 fe ff 30 aa 30 c1 30 b2 30 fc 30 c6 30 ce 30 bb 0000020 30 eb 00 0a 0000024

keeeeeeen
質問者

お礼

アドバイス、ありがとうございます! >UTF-16の文字列のようの見えますね なるほど! てっきり、UTF-8の変種かと思っていました。。。 >$ cat tmp.txt | nkf -w 、、、、、Perlだと、どの様にすると、変換できるのでしょうか? (いくら、ぐぐっても、出てこないもので。。。) お手数かけますが、引き続き、アドバイスいただければ幸いです。

関連するQ&A