5

ドキュメントはすべて私にユニコードのサポートを指示していますが、私の要求はユニコードとは何の関係もないと思います。単一のスカラーのコンテキスト内で生のバイトを処理したいと思います。その長さ(バイト単位)を把握し、そのサブストリング(バイト単位)を取得し、ディスクにバイトを書き込み、ネットワークを介して実行できる必要があります。バイトをperlのエンコードとして扱わずに、これを行う簡単な方法はありますか?

編集

より明確に、

my $data = "Perl String, unsure of encoding and don't need to know";
my @data_chunked_into_1024_bytes_each = #???
4

3 に答える 3

6

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()あなたが期待することをほとんど行う関数もあります。

于 2012-09-16T22:37:22.467 に答える
1

私があなたの質問を正しく理解したなら、あなたが欲しいのはパック/アンパック関数です:http: //perldoc.perl.org/functions/pack.html

于 2012-09-16T21:12:52.413 に答える
1

文字列にコードポイント255を超える文字が含まれていない限り、ほとんどの場合、バイトを使用しlengthsubstr動作するプレーンなバイト文字列として機能します。さらに、ほとんどの出力関数はprintデフォルトでオクテット/バイトを期待し、他に何かを詰め込もうとすると実際に文句を言います。

何らかのエンコーディングであることがわかっている場合は、出力を明示的にエンコード/デコードする必要がありますが、プログラムの問題のある部分ごとに別の特定の質問をする場合にのみ、詳細を追加できます。

于 2012-09-16T21:37:47.797 に答える