プロが教える店舗&オフィスのセキュリティ対策術

JSON形式の文字データの変換方法で悩んでいます。
(WEB上のAPIを叩いて取得してきたデータです)

例えば、、、

\u30aa\u30c1\u30b2\u30fc\u30c6\u30ce\u30bb\u30eb

この様な文字列です。
他のAPIで得られた文字データの場合、、、

Encode::from_to($name ,'utf8','sjis');

で問題なく日本語に変換できていたのですが、この形式の場合、全く変換されません。
上記の様な文字コードを日本語に変換するには、どうしたらよいのでしょう?
助言いただけると幸いです。

A 回答 (3件)

「アホ」というか, 「かなり強引」な感じがするんですよ....


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

>pack なり unpack なりが使えればシンプルでいいんだけど, よくわからなかった.

私もpackやunpack、その他、複数のモジュールを試したのですが、何故かうまくいかず、Tacosanさんの手法で、はじめてうまくいきました。
Tacosanさんの手法を教えていただかなかったら、たぶん、あと1週間は悩んでいたと思います。(^_^;)
重ね重ね、ありがとうございました!

P.S.
私の環境では、うまく稼働しなかった参考にしたサイトを、とりあえず、書き記しておきます。

●Unicode::Japanese::JA
http://search.cpan.org/~hio/Unicode-Japanese-0.4 …

●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

お礼日時:2010/10/07 23:49

アホな方法で


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

この回答への補足

>今度は、何も表示されなくなりました。(^_^;)

と思っていたのですが、、、、

●プログラムファイル自体を「utf8エンコーディングとunix(LF)改行」で保存し直した後、さらに、

Encode::from_to($name ,'utf8','sjis');

を取り去ってみたところ、正常に動いた上に、見事に日本語として表示されました!
(ありがとうございます!)

ただ、上記の置換の場合、改行のみが取り残されていたので、、、

$name=~s/\\n/<br>/g;

を付け加えたところ、完璧なものとなりました。
丸2日悩み続けていた問題が解決しました!
ありがとうございます!!

ただ、、、

>アホな方法で

とあるのですが、この方法のどこが賢くないのでしょうか?
(私は、この手法のどこが賢くないのか理解できる程、賢くありません(^_^;))
ご教授いただけると幸いです。

※今回の教訓

●Perlのソースは、はじめから「utf8エンコーディングとunix(LF)改行」で保存する事。
 (今まで、デフォルトの設定で保存していて、問題が起きなかったため、つい、それをつづけていました。。。)

補足日時:2010/10/07 21:41
    • good
    • 0
この回答へのお礼

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文字へ変換する事はできないもんでしょうか?

お礼日時:2010/10/07 15:12

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
    • good
    • 0
この回答へのお礼

アドバイス、ありがとうございます!

>UTF-16の文字列のようの見えますね

なるほど!
てっきり、UTF-8の変種かと思っていました。。。

>$ cat tmp.txt | nkf -w

、、、、、Perlだと、どの様にすると、変換できるのでしょうか?
(いくら、ぐぐっても、出てこないもので。。。)

お手数かけますが、引き続き、アドバイスいただければ幸いです。

お礼日時:2010/10/07 02:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!