• ベストアンサー

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

  • JSON変換データをjavascriptへ渡したい

    json_encode()関数で、JSON形式の文字列に変換した配列データをjavascriptへ渡したいのですが、 いつのまにか、ただんの文字列になってしまいます。なんででしょうか? ■コード $jsondata= json_encode($originalarray) <script type="text/javascript"> var result = <?php echo($jsondata) ?>; alert(result); </script> ■変数 ・$originalarray Array ( [0] => ./im/1a.j [1] => ./im/2.j [2] => ./im/9_1.j ) ・jsondata [".\/im\/1a.j",".\/im\/2.j",".\/im\/9_1.jp"] ・result ./im/1a.j./im/2.j./im/9_1.jp

    • ベストアンサー
    • PHP
  • json形式からcsv形式への変換

    ツイッターのデータをjson形式からcsv形式へ変換したいのですが、フリーのツールやWebサービスなどで、変換できるものはないでしょうか? その他、簡単なやり方がありましたらご教示頂けると幸いです。 一応、ひと通り調べては見たのですが、csv→jsonはあっても、json→csvが見つかりませんでした。。。

  • JSON形式のデータ解析が出来なくて悩んでます。

    「Twitterから学ぶ,Web APIのキホン」(http://gihyo.jp/dev/serial/01/perl-hackers-hub/000403)のサンプルプログラムを参考にitunesの検索apiの検索結果を解析しようとしているのですが解析できなく、何も表示されない状態になります。 itunes 検索api http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html まずは上のSearch Examplesにいくつか示しているitunes apiの検索結果(jsonデータ)から"artistId"に対する項目や"artistName"に対する項目を抜き出そうと試みています。 以下は実際に私が実行しているプログラムです。 ----------------------------------------------------------------- print <<"HTML"; Content-type: text/html <html> HTML use LWP::UserAgent; use URI; use JSON qw(decode_json); use Encode qw(encode_utf8); my $uri = URI->new('※ここにitunes apiの検索結果のurl入れています'); my $ua = LWP::UserAgent->new; my $res = $ua->get($uri); my $json = $res->content; my $ref = decode_json($json); for my $applist ( @{ $ref->{results} } ) { print encode_utf8("$applist->{artistId}: $applist->{artistName}\n");} -------------------------------------------------------------------------------------- としているのですが結果は何も表示されません。※cgiはmac 環境にてUTF-8 Mac(CR)で保存しております。 「Twitterから学ぶ,Web APIのキホン」のサンプルプログラムは正常に動いて表示出来ているのでモジュールやPerlのパスには問題ないと思います。 どうすればitunes 検索apiのjsonデータがPerlでちゃんと解析されるのかご教示お願いします。

    • ベストアンサー
    • Perl
  • JSON形式のデータを表示したい

    はてなブックマークエントリー情報取得API(http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF%A5%A8%A5%F3%A5%C8%A5%EA%A1%BC%BE%F0%CA%F3%BC%E8%C6%C0API?kid=184075) で取得したJSON形式のデータをページに表示したいのですが、どの様にすれば良いのでしょうか。 例えば http://b.hatena.ne.jp/entry/json/http://okwave.jp/ のブックマークコメントを抜き出したり、ということを想定しているのですが、可能でしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • JSON の出力先ディレクトリの指定方法

    cakePHPの初心者です。 以下のようにPHPからJSON形式で、データファイルを出力したいと考えております。 $json = new Services_JSON; $encode = $json->encode($hoge); echo $encode; ですが、出力先ディレクトリの指定の仕方が分かりません。 ご存知の方、恐れ入りますが方法を教えて頂けますでしょうか?

    • ベストアンサー
    • PHP
  • JSONって単純にテキストの書き方だけでしょうか。

    現在APIを叩いてテキストデータを返すプログラムを作成しています。 そこで返すテキストデータの形ですが、いろいろ調べたらxml,json,csvなどなどがあります。よく見ると各形式のメリットとデメリットや使うまた使わないケースというのはあるんですが、結局どの形式でも元々のテキストデータが同じものなので、極端の話自分で決めた形式でも(例えば全てのデータは半角のスペースで区切るとか)問題はないでしょうか。 またある形式から別の形式への変換(例えばjsonからxmlとかに)ほとんどのプログラム言語の一般的なライブラリで簡単にできそうなので結局どの形式を採用してもあまり変わらない気がしますが、みなさんどう思いますか?

  • JSONデータをフォームにセットしたい

    JSONデータを「jQuery.val」でフォームにセットしたいのですが、うまくいきません。どうしたら良いでしょうか? 具体的には、[",]が削除された状態でセットされます。元は配列ですが、JSONデータへ変換したので、フォームへセット出来ると思っていたのですが…。 JSONは、「ある形式に沿った文字列」という認識でいたのですが、違うのでしょうか? ■コード $jsondata= json_encode($originalarray) <script type="text/javascript">  var result = <?php echo($jsondata) ?>;  $("input#jsondata").val(result); </script> ■変数 ・$originalarray Array ( [0] => ./im/1a.j [1] => ./im/2.j [2] => ./im/9_1.j ) ・jsondata [".\/im\/1a.j",".\/im\/2.j",".\/im\/9_1.jp"] ・フォームにセットされる値 ./im/1a.j./im/2.j./im/9_1.jp →ここに「jsondata」をセットさせたい

  • 【PHP,JavaScript】文字が誤変換される

    以下は、プログラムの一部でJavaScriptからPHPにJSONデータを送信する処理です。 引数を渡すJavaScript側(Extjsライブラリを利用)のプログラム // Ajaxリクエスト処理 Ext.Ajax.request({ url: "php/updatedata.php", success: handleSuccess, failure: handleFailure, params: { data: Ext.util.JSON.encode(data) } // パラメータをJSON形式にして送信 }); 配列dataの中身は「data[0] = 3,data[1] = パソコン」となっています。 Ext.util.JSON.encode(data)により配列dataをJSONに変換して 受信するPHP側のプログラム:updatedata.php JavaScriptで渡したJSONを$_REQUEST['data']で受信して中身を見ると以下のようになっています。 if (isset($_REQUEST['data'])) { $tmp = $_REQUEST['data']; 【受信したJSONデータの中身】 [{"id":"3","name":"繝代た繧ウ繝ウ"}] 「パソコン」という文字列が「繝代た繧ウ繝ウ」という文字列に変換されてしまっています。 Extjs側の「Ext.util.JSON.encode」が悪いのでしょうか、それともPHP側の「$_REQUEST」が悪いのでしょうか。はたまた何か別の原因があるのでしょうか。 ちなみに、環境は以下のようになっています。 WindowsXP,Windows7(両方とも同じ結果になってしまいました。) PHP5.3.1 Ext3.3.0 以上、よろしくお願い致します。

  • JSONでの日本語を出力する際のエンコードについて

    Javaでorg.json.simpleを使ってJSON形式のデータを出力しようとしています。 公開されているAPIなどをみると、日本語の部分は"\uxxxx"のように エスケープされているかと思うのですが、 下記の方法ではそのまま日本語で"あいうえお"と表示されてしまいます。 import org.json.simple.JSONObject; JSONObject obj = new JSONObject(); obj.put("name", "あいうえお"); System.out.print(obj.toString()); JSONで日本語を扱う場合は必ずエスケープしなくてはならないでしょうか? この場合はどのようにしたらエスケープできるでしょうか?

  • ヤフオクを文字検索してフィードをJSON形式で得る

    ヤフオクを文字検索してフィードをJSON形式で得ることはできますか? 探し方が悪いのか全然見つけられません。 以前youtubeの検索は以下の様にできた経験があったので同じようにできないか探しています。 http://gdata.youtube.com/feeds/api/videos?v=2&alt=jsonc&start-index=○&max-results=○○○&q=検索文字列

    • ベストアンサー
    • CSS