utf16の記号のutf8へのエンコード(もしくはマッチ又は削除)がうまくいきません。
お世話になります。
前々回、、、、
http://oshiete.goo.ne.jp/qa/6232556.html
でUTF-16をUTF-8に変換する方法を教えていただきました。
(その節は、ありがとうございました)
$name=~s/\\u([[:xdigit:]]{4})/chr eval "0x$1"/eg;
が、この方法だと、記号が変換されず、例えば、、、
●「~」 は 「\x{301c} 」 と表示され
●「・」 は 「\x{2022}」 と表示されてしまいます。
これらの記号のデコード方法が調べても分からなかったので、いっそ、削除しちゃえ!とばかりに、、、
「「x」から始まり「}」で終わる文字は根こそぎ削除!というプログラムを組み込んでみたのですが、まったく反応せず。
チェックの為に行った「x」だけの削除ですらマッチせず。。。。
(これでは反応しないはずですね。。。)
ということで、utf16の「記号」のutf8へのエンコード(もしくはマッチ又は削除)の方法について、アドバイスいただければ幸いです。
No.1
- 回答日時:
「~」 は 「\x{301c} 」 と表示され
とかいうのは, Perl の表示上の問題です. 文字をうまく出力できないときに, このようにコードポイントを使って表示することがあります. これはあくまで「コードポイントが 301C であるような文字」であって「\x{301c} という文字の並び」ではないので, ここが「x」にマッチすることはありません. どのように出力しているのかを (行っているなら出力の前の encode も含めて) 見せてくれれば, なんとかなるかもしれんけど....
ただ, 特にコードポイント 301C についてはいろいろ問題があるので, 一筋縄にはいかない可能性を覚悟してください.
この回答への補足
Tacosan様、アドバイス、ありがとうございます!
>「コードポイントが 301C であるような文字」であって「\x{301c} という文字の並び」ではない
なるほど。。。
どうりで「x」にすらマッチしないはずです。。。。
(でも、何故か、その中の数字にはマッチさせることができます)
>どのように出力しているのかを (行っているなら出力の前の encode も含めて) 見せてくれれば, なんとかなるかもしれんけど....
助け舟、ありがとうございます。
上から下までの流れは、こんな感じです。
#!/usr/local/bin/perl
use Encode;
my $utf8 = decode_utf8($unknown);
binmode STDOUT, ":encoding(cp932)";
binmode STDIN, ":encoding(utf8)";
use utf8;
use Encode;
binmode STDOUT, ":utf8";
use CGI;
my $query = CGI->new;
my $word = $query->param('word');
$searchword=$word;
Encode::from_to($searchword,'sjis','utf8');
●某所API(アップルのiTunes sotreです)を叩きます。
例($searchwordが「english」の場合)
http://ax.phobos.apple.com.edgesuite.net/WebObje …
●すると、JSON形式のUTF-16らしきデータが入手できます。
●それを独得の方法でパースします(XML形式に強引に変換し、TreePPでパース(笑))
●得られたデータを先日教えていただいた
$name=~s/\\u([[:xdigit:]]{4})/chr eval "0x$1"/eg;
でutf8に変換。
●<html lang="ja"><meta http-equiv="content-type" content="text/html; charset=shift_jis">で出力しています。
>特にコードポイント 301C についてはいろいろ問題があるので, 一筋縄にはいかない可能性を覚悟してください.
う、、、知らず知らずのうちに、perlの奥深い沼にたどり着いていたのですね。。。(笑)
1週間程、沼にハマって、抜け出すことができないでいます。。。 (^_^;)
No.2ベストアンサー
- 回答日時:
あぁ, 「コードポイント 301C がど~たらこ~たら」というのは Perl とは (少なくとも直接には) 無関係で, いろんな文字コードがからむ闇の世界のお話です.
実はコードポイント 301C にはいろいろと問題がありまして.... 以下 Unicode の表を参照してもらえるとありがたいのですが
・Unicode コードポイント 301C の文字の名称は「波ダッシュ」
・一方 Unicode コードポイント FF5E に「全角ティルダ」が存在する
で, このうちどちらを JIS X 0208 の 1区 33点の文字に対応させるかで混乱があります. Unicode コンソーシアムとしては「301C が対応する」としているのですが, その一方で「この対応が常に守られているとは限らない」という事実もあります (Unicode の表にもそのように書いてある).
実際試してみると, Perl の場合
・cp932 では Unicode FF5E が JIS X 0208 1区 33点に対応する
・shiftjis では Unicode 301C が JIS X 0208 1区 33点に対応する
ということが分かります (もちろん対応しないものはうまく変換できない). この「JIS X 0208 の 1区 33点と対応する文字はどれ」問題は文字コード業界 (ってなんだ) では有名だったりします.
301C の問題を解決するだけなら
・cp932 をやめて shiftjis にする
・\x{301C} を \x{FF5E} に変換しておく (s/\x{301C}/\x{FF5E}/g なり tr なり)
でいいわけですが, 当然前者だとほかの文字でうまくいかないという問題を起こす可能性があります. 後者ならそのような問題は起きない代わりに「うまく変換できない文字を見つけたらそのたびにモグラたたき」ということになります. ん~, ほかにも解決手段はあるかも....
ほら, なんとなく一筋縄ではいかないような気がするでしょ?
この回答への補足
Tacosan様
俗世間の人間の私に、プログラムの闇の世界(もしくは俗世間から超越した聖なる世界)について、詳しく解説くださり、ありがとうございます!!
そして、助け舟、ありがとうございます!
曖昧な事が許されない(と思い込んでいた)プログラムの世界に、この様な底知れぬ闇が潜んでいたとは、思いもよりませんでした。。。(笑)
俗世の人間が、この様な沼にハマッたら、イチコロです。w
で、助け舟にありました「個別変換」で、急場をしのぎたいと思います。
その際、特殊文字{}を保護しようと
$name=~s/\x\{2122\}/(TM)/g;
とすると、マッチしなかったのですが、
Tacosan様提示の様に
$name=~s/\x{2122}/(TM)/g;
とすると、うまく置換できました!
(この事を教授いただかなかったら、底なし沼から脱出できず、今頃、泥人間になっていたとい思います)
問題を起こす記号は、6種類ぐらいの感じがしているので、とりあえず、これらを処理しておきたいと思います。
>なんとなく一筋縄ではいかないような気がするでしょ?
なんとなくどろこか、二筋縄でもいかない様なので、「個別変換」という泥縄式で対処します。w
詳しい解説と助け舟、ありがとうございました!!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像が表示でnull; this.src
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
アルファベットに付いて質問し...
-
Raspberry Pi
-
Perl 特定のフォルダ以外削除
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
bashスクリプト
-
Perlのエラーについてご教授く...
-
Perlで特定文字列から特定文字...
-
画像が表示でnull; this.src
-
Wallpaper Engineでおすすめの...
-
Perl言語について。
-
perl LWPでURLにアクセスした時...
-
Perlで時間の計算
-
Perlで、「が」を、「...
-
ファイルアイコンの左下に緑の□...
-
Perl の外部モジュールの利用方法
-
このファイルを開く方法で困っ...
-
perlで2次元配列をサブルーチ...
-
Windows10においての『Perl』の...
おすすめ情報