Perl 文字列は、概念的には文字の文字列であり、(通常は) Unicode コード ポイントを表す正の 32 ビット整数です。Perl のバイト文字列は、すべての文字が 256 未満の値を持つ単なる文字列です。
(これは概念的な見方です。perl インタープリターはバイト文字列を (上記の意味で) 実際のバイト文字列として格納しようとしますが、256 の文字値を含む文字列には一般化された UTF-8 エンコーディングを使用するため、内部表現はやや複雑です。しかし、これはすべてユーザーに対して透過的であると想定~
されており、実際には、ビットごとの not ( ) 演算子のようないくつかの醜い歴史的なコーナーケースを除いて、ほとんど透過的です.)
一般的な文字列をバイト文字列に変換する方法については、文字列に何が含まれているか、およびバイト文字列に何が含まれているかによって異なります。
文字列がすでにバイト文字列である場合 (たとえば、バイナリ モードでファイルから読み取る場合)、何もする必要はありません。文字列には、255 を超える文字を含めることはできません。含まれている場合、それはエラーであり、おそらく暗号化コードによってそのように報告されます。
同様に、文字列が ASCII または ISO-8859-1 エンコーディング (それぞれ Unicode の 7 ビットおよび 8 ビットのサブセットをエンコードする) でテキストをエンコードすることになっている場合、何もする必要はありません: 255 は既に正しくエンコードされており、それ以上の値はそれらのエンコードでは無効です。
入力文字列に他のエンコーディングでエンコードしたい (Unicode) テキストが含まれている場合は、文字列をそのエンコーディングに変換する必要があります。これを行う通常の方法は、次のようにEncodeモジュールを使用することです。
use Encode;
my $byte_string = encode( "name of encoding", $text_string );
明らかに、次の方法でバイト文字列を対応する文字列に戻すことができます。
use Encode;
my $text_string = decode( "name of encoding", $byte_string );
UTF-8 エンコーディングの特殊なケースでは、代わりに組み込みutf8::encode()
関数を使用することもできEncode::encode()
ます。
utf8::encode( $string );
これは本質的に次と同じことを行います:
use Encode;
$string = encode( "utf8", $string );
とは異なりEncode::encode()
、このutf8::encode()
関数は入力文字列を直接変更することに注意してください。"utf8"
上記は、公式の Unicode 範囲外の値を許容する Perl の拡張 UTF-8 エンコーディングを参照していることにも注意してください。厳密に標準に準拠した UTF-8 エンコーディングの場合"utf-8"
は、ハイフンを使用します (詳細については Encode documentation を参照してください)。そして、はい、utf8::decode()
あなたが期待することをほとんど行う関数もあります。