• ベストアンサー

文字変換について

Perlの文字変換について質問があります。 文字コードをJISからShift_JISに変換するには、下記のどれが正しい記述なのでしょうか? ・Encode::from_to($_, "jis", "shiftjis" ) ・encode("shiftjis", $_) ・encode("shiftjis", decode("utf8", $_)) 以上、よろしくお願い致します

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

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

残念ながら、ご質問に簡潔に答える訳には行きません。 条件によって正解が変るからです。 Perl のマルチバイト文字処理は、5.8 で Encode/encoding が入って世界が変ります。 5.6やそれ以前の Perl のスカラ変数の内容は「文字列処理向け」なのか「数値処理向け」なのかを意識していれば充分でした。 しかし、Perl5.8 では新たに「インポート済文字列」か「未インポート文字列」かの区別を、プログラマがせにゃなりません。 未インポート文字列というのは、「文字コード不明のバイト列」という事です。 つまり「文字コードをJISからShift_JISに変換する」という目的自体が上記の新しい考え方に馴染み難いのです。 で、本題です。 状況に応じて、3種の処理を使い分けてください。 1「未インポート文字列」があって、プログラマはそれが JISコードである事を知っているなら、それを別の文字コードの「未インポート文字列」に変換することができます。 ・Encode::from_to($_, "7bit-jis", "Windows-31J" ); # MSのSJIS ・Encode::from_to($_, "iso-2022-jp", "Shift_Jis" ); # 規格のSJIS 2 元は JIS でもすでにインポート済であるなら、SJISへの変換はエクスポートするだけです。 ・encode("Windows-31J", $_); # MSのSJIS ・encode("Shift_Jis", $_); # 規格のSJIS 3 JISである事が判っている「未インポート文字列」をインポートするのは ・decode("ISO-2022-JP", $_); 注意: 『インポート』と言う語は、この回答を書くために便宜上付けた名前です。 一般には通じない場合もあるので注意してください。

rx-8_excel
質問者

お礼

ご回答、ありがとうございました。 「未インポート文字列」というのは、PG上で文字コードを定義する必要はない、ということでよろしいでしょうか? 「未インポート文字列」であっても、仕様で文字コードが特定できている場合は、1番の方法で行けるということですね。 大変ご丁寧な説明ありがとうございました。

その他の回答 (2)

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.3

No.1の「インポート済」というのは、 一般的にUTF8フラグと呼ばれていると思います。 Perl5.8以降で文字列を扱うなら 「UTF8フラグ」と「PerlIOレイヤ」は知っておいて損はないと思います。 以下参考リソース。 Perl 5.8.x Unicode関連 http://www.rwds.net/kuroita/program/Perl_unicode.html UTF8 フラグあれこれ - daily dayflower http://d.hatena.ne.jp/dayflower/20080219/1203493616 Perl の内部形式に関する考察 http://www.r-definition.com/program/perl/internalformat.htm

rx-8_excel
質問者

お礼

ご回答ありがとうございます。 Perlを触るのが初めてだったので、教えていただいたサイトでもう少し学習してみようと思います。 一先ず、チーム内で話し合って、方針は決まったので、一安心といったところです。

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

> 「未インポート文字列」というのは、PG上で文字コードを定義する必要はない、ということでよろしいでしょうか? > 「未インポート文字列」であっても、仕様で文字コードが特定できている場合は、1番の方法で行けるということですね。 どちらも正しいです。 しかし、Perl5.8 を使うからには、考え方を変える方が楽をできます。 それは、文字コードを意識するのは入力時と出力時だけにして、それ以外はインポート済文字列で処理することです。 そうすれば... 半角は1バイトで全角は2バイトなんていう面倒さから開放されます。 入出力時は、open() や binmode() で文字コードを指定すれば、インポート・エクスポートすら自動で処理されます。 本題でないので詳しくは書きませんが、お気が向かれたなら眺めてみる事をお勧めします。

参考URL:
http://namazu.org/~tsuchiya/perl/perl-5.8.html

関連するQ&A