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

UTF-8に不慣れで感じがまだ、つかめておりません。

○ encode('shiftjis', decode('utf8', $utf_str));

とすると、正しく漢字が表示されましたが、

× encode('shiftjis', $utf_str));

とすると、?????などの文字列が表示されます。

$utf_strは UTF-8だと思いますが、
decode('utf8', $utf_str)が必要な理由はなんでしょうか?

あと、Perl5.8では from_toがありますが上と同じ事を

from_to($utf_str, "utf8", "shiftjis");

とできるということでしょうか?

A 回答 (2件)

>use encodingはプラグマですが、副作用があるので使わない方が良いという内容の記事を読んだことがありますが、大多数の方は無問題で使っているということでしょうか?


その記事を読んだことはないし、他の大多数の人のことは知らないので、よくわかりませんが、
経験的には、
use encoding 'shiftjis';
とかでは(内部コードへの)マップに問題が有る時があります。
しかし
Perlの内部フォーマットがUTF-8なので、UTF-8では問題は起こらないという認識(私的には)です。
また、クックブックに書かれている説明によると、
”全てのオクテット文字列を有効なUTF-8文字列にはできないが、UTF-8文字列は全て有効なオクテット文字列に変換できる”(Vol.1,1-10)
とあるので、UTF-8を使っている場合は問題ないと思います。
ただ、以前unicodeから文字コード変換で一部割り当てがおかしいものがあるというような記事を(OKWeb)で読んだことがありますので、やはり、文字コードの変換には一部うまくいかない場合もあるということかと思います。
    • good
    • 0

>decode('utf8', $utf_str)が必要な理由はなんでしょうか?


多分、スクリプトの先頭で
use encoding 'UTF-8';
とされていないのでしょう。
スクリプトがどの文字コードで書かれているかを、Perlに指示していないので、
$utf_strが内部表現としてのUTF-8でなく単なるオクテット(バイト並び)だとして扱われているためにdecode('utf8', $utf_str)が必要になるのだと思われます。

>上と同じ事を
from_to($utf_str, "utf8", "shiftjis");
で同じコトができます。

なお、スクリプトがUTF-8の時にシフトJISで出力するだけなら
use encoding 'UTF-8', STDOUT => "shiftjis";
と書けば事足ります(STDERRも必要かも)

この回答への補足

use utf8;
binmode STDOUT, ":utf8";
としています。

use encodingはプラグマですが、副作用があるので使わない方が良いという内容の記事を読んだことがありますが、大多数の方は無問題で使っているということでしょうか?

補足日時:2005/08/30 00:54
    • good
    • 0

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