=encoding euc-jp =head1 NAME =begin original perlunitut - Perl Unicode Tutorial =end original perlunitut - Perl における Unicode のチュートリアル =head1 DESCRIPTION =begin original The days of just flinging strings around are over. It's well established that modern programs need to be capable of communicating funny accented letters, and things like euro symbols. This means that programmers need new habits. It's easy to program Unicode capable software, but it does require discipline to do it right. =end original 文字列を単に放り出す日々は終わりました。 最近のプログラムでは変わったアクセントのついた文字や、ユーロのマークの ようなものを通信出来る必要があることが確立しています。 これは、プログラマは新しい意味が必要であることを意味しています。 Unicode 対応ソフトウェアをプログラムするのは簡単ですが、それを正しく行うには 訓練が必要です。 =begin original There's a lot to know about character sets, and text encodings. It's probably best to spend a full day learning all this, but the basics can be learned in minutes. =end original 文字集合とテキストエンコーディングに関しては学ぶべきことがたくさんあります。 おそらくこれら全てを学ぶのに丸一日を使うのが最良ですが、基本は数分で 学べます。 =begin original These are not the very basics, though. It is assumed that you already know the difference between bytes and characters, and realise (and accept!) that there are many different character sets and encodings, and that your program has to be explicit about them. Recommended reading is "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" by Joel Spolsky, at L. =end original しかし、これらは超基本ではありません。 あなたがすでにバイトと文字の違いを知っていて、様々な文字集合と エンコーディングがあることを自覚していて(さらに受け入れていて!)、 あなたのプログラムがこれらを明示的にする必要がある、と仮定しています。 お勧めの読み物は Joel Spolsky による "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" L です。 =begin original This tutorial speaks in rather absolute terms, and provides only a limited view of the wealth of character string related features that Perl has to offer. For most projects, this information will probably suffice. =end original このチュートリアルはどちらかといえば独立した用語を使っていますし、Perl が 提供している豊富な文字列に関する機能のうち限定された見方のみを扱っています。 ほとんどのプロジェクトにとっては、おそらくこの情報で十分です。 =head2 Definitions (定義) =begin original It's important to set a few things straight first. This is the most important part of this tutorial. This view may conflict with other information that you may have found on the web, but that's mostly because many sources are wrong. =end original まず、いくつかのことをはっきりさせることが重要です。 これはこのチュートリアルで最も重要な部分です。 この考え方はあなたが web で見つけたその他の情報と矛盾するかもしれませんが、 ほとんどの場合、それは web で見つけた情報の方が間違っているためです。 =begin original You may have to re-read this entire section a few times... =end original このセクション全体を何回か読み直す必要があるかもしれません… =head3 Unicode =begin original B is a character set with room for lots of characters. The ordinal value of a character is called a B. (But in practice, the distinction between code point and character is blurred, so the terms often are used interchangeably.) =end original B は大量の文字を表現できる文字集合です。 文字の序数は B<符号位置> と呼ばれます。 (しかし実際には、符号位置と文字との区別はあいまいなので、この用語はしばしば 同義語として使われます。) =begin original There are many, many code points, but computers work with bytes, and a byte has room for only 256 values. Unicode has many more characters than that, so you need a method to make these accessible. =end original 符号位置は本当に大量にありますが、コンピュータはバイト単位で 動いていて、バイトは 256 種類の値のみを持ちます。 Unicode はもっとたくさんの文字を持っているので、これらにアクセスできるような 手法が必要です。 =begin original Unicode is encoded using several competing encodings, of which UTF-8 is the most used. In a Unicode encoding, multiple subsequent bytes can be used to store a single code point, or simply: character. =end original Unicode はいくつかの競合するエンコーディングを使ってエンコードされていて、 UTF-8 がもっともよく使われています。 Unicode のエンコーディングでは、複数の引き続くバイト列を一つの符号位置 (あるいは単純に「文字」)を保管するのに使います。 =head3 UTF-8 =begin original B is a Unicode encoding. Many people think that Unicode and UTF-8 are the same thing, but they're not. There are more Unicode encodings, but much of the world has standardized on UTF-8. =end original B は Unicode のエンコーディングです。 多くの人々は Unicode と UTF-8 は同じだと考えていますが、違います。 Unicode のエンコーディングには他にもありますが、世界のほとんどでは標準として UTF-8 が使われています。 =begin original UTF-8 treats the first 128 codepoints, 0..127, the same as ASCII. They take only one byte per character. All other characters are encoded as two or more (up to six) bytes using a complex scheme. Fortunately, Perl handles this for us, so we don't have to worry about this. =end original UTF-8 は最初の 128 の符号位置(0..127) を ASCII と同様に扱います。 文字毎に 1 バイトしかかかりません。 その他の文字は、複雑な仕組みを使って 2 またはそれ以上 (最大 6) のバイトを 使います。 幸い、Perl がその作業をするので、私たちがそれについて心配する必要は ありません。 =head3 Text strings (character strings) (テキスト文字列(文字の文字列)) =begin original B, or B are made of characters. Bytes are irrelevant here, and so are encodings. Each character is just that: the character. =end original B<テキスト文字列>、または B<文字の文字列> は文字からなります。 バイト列はここでは無意味で、エンコーディングも無意味です。 各文字は単に: 文字です。 =begin original On a text string, you would do things like: =end original テキスト文字列では、以下のようにします: $text =~ s/foo/bar/; if ($string =~ /^\d+$/) { ... } $text = ucfirst $text; my $character_count = length $text; =begin original The value of a character (C, C) is the corresponding Unicode code point. =end original 文字の値 (C, C) は対応する Unicode 符号位置です。 =head3 Binary strings (byte strings) (バイナリ文字列(バイト文字列)) =begin original B, or B are made of bytes. Here, you don't have characters, just bytes. All communication with the outside world (anything outside of your current Perl process) is done in binary. =end original B<バイナリ文字列>、または B<バイト文字列> はバイト列からなります。 ここでは、文字はなく、単にバイトだけがあります。 外側の世界(現在の Perl プロセスの外側のあらゆるもの) との通信はバイナリで 行われます。 =begin original On a binary string, you would do things like: =end original バイナリ文字列では、以下のようにします: my (@length_content) = unpack "(V/a)*", $binary; $binary =~ s/\x00\x0F/\xFF\xF0/; # for the brave :) print {$fh} $binary; my $byte_count = length $binary; =head3 Encoding (エンコード) =begin original B (as a verb) is the conversion from I to I. To encode, you have to supply the target encoding, for example C or C. Some encodings, like the C ("latin") range, do not support the full Unicode standard; characters that can't be represented are lost in the conversion. =end original (動詞としての) B<エンコード> は I<テキスト> から I<バイナリ> への変換です。 エンコードするには、C や C のような、エンコード先の エンコーディングが必要です。 C ("latin") のような一部のエンコーディングは、Unicode 標準に 完全に対応していません; 表現できない文字は変換時に失われます。 =head3 Decoding (デコード) =begin original B is the conversion from I to I. To decode, you have to know what encoding was used during the encoding phase. And most of all, it must be something decodable. It doesn't make much sense to decode a PNG image into a text string. =end original B<デコード> は I<バイナリ> から I<テキスト> への変換です。 デコードするには、エンコード時に使われたエンコーディングが何かを知っている 必要があります。 そしてそもそも、それはデコード可能でなければなりません。 PNG イメージをテキスト文字列にデコードしてもほとんど意味はないです。 =head3 Internal format (内部形式) =begin original Perl has an B, an encoding that it uses to encode text strings so it can store them in memory. All text strings are in this internal format. In fact, text strings are never in any other format! =end original Perl には B<内部形式> と呼ばれる、テキスト文字列をメモリに格納できるように エンコードを行うために使うエンコーディングがあります。 全てのテキスト文字列はこの内部形式になります。 実際、テキスト文字列が他の形式になることは決してないのです! =begin original You shouldn't worry about what this format is, because conversion is automatically done when you decode or encode. =end original この形式がどのようなものであるかを気にする必要はないはずです; なぜなら 変換はデコードやエンコードの際に自動的に行われるからです。 =head2 Your new toolkit (新しいツールキット) =begin original Add to your standard heading the following line: =end original あなたの標準ヘッダに以下の行を追加します: use Encode qw(encode decode); =begin original Or, if you're lazy, just: =end original あるいは、あなたが怠け者なら、単に以下のようにします: use Encode; =head2 I/O flow (the actual 5 minute tutorial) (I/O の流れ(実際の 5 分間チュートリアル)) =begin original The typical input/output flow of a program is: =end original 典型的なプログラムの入出力の流れは以下のものです: =begin original 1. Receive and decode 2. Process 3. Encode and output =end original 1. 受信してデコードする 2. 処理する 3. エンコードして出力する =begin original If your input is binary, and is supposed to remain binary, you shouldn't decode it to a text string, of course. But in all other cases, you should decode it. =end original もし入力がバイナリで、バイナリのままにしておく必要があるなら、これを テキスト文字列にデコードするべきではありません。 しかし、それ以外の全ての場合では、デコードするべきです。 =begin original Decoding can't happen reliably if you don't know how the data was encoded. If you get to choose, it's a good idea to standardize on UTF-8. =end original もしデータがどのようにエンコードされたか分からないなら、デコードには 信頼性がありません。 もしあなたが選択するのなら、UTF-8 に標準化するのはいい考えです。 my $foo = decode('UTF-8', get 'http://example.com/'); my $bar = decode('ISO-8859-1', readline STDIN); my $xyzzy = decode('Windows-1251', $cgi->param('foo')); =begin original Processing happens as you knew before. The only difference is that you're now using characters instead of bytes. That's very useful if you use things like C, or C. =end original 処理は今まで通りに行います。 唯一の違いは、バイトではなく文字を使うことです。 これは C や C のようなものを使うときにとても便利です。 =begin original It's important to realize that there are no bytes in a text string. Of course, Perl has its internal encoding to store the string in memory, but ignore that. If you have to do anything with the number of bytes, it's probably best to move that part to step 3, just after you've encoded the string. Then you know exactly how many bytes it will be in the destination string. =end original テキスト文字列にはバイト列はないということを自覚することは重要です。 もちろん、Perl は文字列をメモリに保管するために内部形式を使いますが、 これは無視してください。 もしバイト数を扱うような何かをする必要があるなら、おそらくその部分を ステップ 3 の、文字列をエンコードした直後に移すのが最良です。 そこで目的の文字列が何バイトになるのかが正確に分かります。 =begin original The syntax for encoding text strings to binary strings is as simple as decoding: =end original テキスト文字列をバイナリ文字列にするための文法はデコード時と同じぐらい 単純です: $body = encode('UTF-8', $body); =begin original If you needed to know the length of the string in bytes, now's the perfect time for that. Because C<$body> is now a byte string, C will report the number of bytes, instead of the number of characters. The number of characters is no longer known, because characters only exist in text strings. =end original もし文字列のバイト数が必要なら、今がそれをする最良のタイミングです。 なぜなら C<$body> はバイト文字列なので、C は文字数ではなく、 バイト数を返します。 文字というものはテキスト文字列でのみ存在するので、もはや文字数というものは わからなくなっています。 my $byte_count = length $body; =begin original And if the protocol you're using supports a way of letting the recipient know which character encoding you used, please help the receiving end by using that feature! For example, E-mail and HTTP support MIME headers, so you can use the C header. They can also have C to indicate the number of I, which is always a good idea to supply if the number is known. =end original そしてもしあなたの使っているプロトコルが、あなたが使ったエンコーディングを 相手に伝える方法に対応しているなら、その機能を使って受信側を助けてあげて ください! 例えば、E-mail と HTTP は MIME ヘッダに対応しているので、 C ヘッダが使えます。 I<バイト> 数を示すための C もあるので、もしバイト数が わかっているなら、これをつけるのは常に良い考えです。 "Content-Type: text/plain; charset=UTF-8", "Content-Length: $byte_count" =head1 SUMMARY (まとめ) =begin original Decode everything you receive, encode everything you send out. (If it's text data.) =end original 受け取ったもの全てを decode して、送り出すもの全てを encode しましょう。 (扱っているのがテキストデータなら。) =head1 Q and A (or FAQ) =begin original After reading this document, you ought to read L too. =end original この文書を読んだ後、L も読むべきです。 =head1 ACKNOWLEDGEMENTS (謝辞) Thanks to Johan Vromans from Squirrel Consultancy. His UTF-8 rants during the Amsterdam Perl Mongers meetings got me interested and determined to find out how to use character encodings in Perl in ways that don't break easily. Thanks to Gerard Goossen from TTY. His presentation "UTF-8 in the wild" (Dutch Perl Workshop 2006) inspired me to publish my thoughts and write this tutorial. Thanks to the people who asked about this kind of stuff in several Perl IRC channels, and have constantly reminded me that a simpler explanation was needed. Thanks to the people who reviewed this document for me, before it went public. They are: Benjamin Smith, Jan-Pieter Cornet, Johan Vromans, Lukas Mai, Nathan Gray. =head1 AUTHOR (著者) Juerd Waalboer <#####@juerd.nl> =head1 SEE ALSO L, L, L, L =begin meta Translate: SHIRAKTA Kentaro Status: completed =end meta