2

ASCII "@" 文字をバイナリ形式でファイルに書き込む次のコードがあります。

fin=open('a.bin','wb')
fin.write('\x40')
fin.close()

1バイトの長さの「a.bin」に「@」文字が書き込まれていることがわかります。

ただし、代わりにユニコード文字を書き込もうとすると:

fin=open('a.bin','wb')
fin.write(u'\x40')
fin.close()

「a.bin」はまだ 1 バイト長であることが判明しました。Unicode 文字は 2 バイトなので、長さは 2 バイトにすべきだと思いました。私が見落としていた些細なことがあるかもしれません。

4

3 に答える 3

7

Unicode とエンコーディングを混同しています。エンコーディングは、0 ~ 255 (バイト) の範囲の個々の値の範囲内でテキストを表す標準であり、Unicode は、テキストのグリフを表すコードポイントを記述する標準です。この 2 つは関連していますが、同じものではありません

Unicode 標準には、いくつかのエンコーディングが含まれています。UTF-16 は、コードポイントごとに 2 バイトを使用するエンコーディングの1 つですが、標準に含まれているエンコーディングはこれだけではありません。UTF-8 もそのようなエンコーディングであり、コードポイントごとに可変バイト数を使用します。

ただし、ファイルは、明示的なエンコーディングを指定しない場合に Python 2 で使用されるデフォルトのコーデックである ASCII を使用して書き込まれます。コードポイントごとに2バイトが表示されると予想される場合は、明示的に UTF-16 にエンコードします。

fin.write(u'\x40'.encode('utf16-le')

これは UTF-16 をリトル エンディアンのバイト順で書き込みます。utf16-beコーデックもあります。通常、UTF-16 や UTF32 などのマルチバイト エンコーディングでは、BOM またはバイト オーダー マークも含めます。エンディアンを選択せず​​に UTF-16 を書き込むと、自動的に含まれます。

fin.write(u'\x40'.encode('utf16')

続行する前に、Unicode、コーデック、および Python について学習することを強くお勧めします。

于 2013-08-16T20:32:42.993 に答える
1
  • U+0000 から U+007F (US-ASCII レパートリー) までの文字番号は、オクテット 00 から 7F (7 ビット US-ASCII 値) に対応します。直接的な結果は、プレーン ASCII 文字列も有効な UTF-8 文字列であるということです。
  • ISO 10646 の変換形式である UTF-8
于 2013-08-16T20:37:16.383 に答える