1

Python 2.7.2 に u"\u0638" という文字列があります。ファイルに書き込むとき:

f = open("J:\\111.txt", "w+")
f.write(u"\u0638".encode('utf-16'))
f.close()

16 進数では次のようになります。FF FE 38 06 このような文字列を標準出力に出力すると、「\xff\xfe8\x06」と表示されます。

質問: stdout に出力される文字列の \x38 はどこにありますか? つまり、標準出力に出力される文字列が「\xff\xfe\x38\x06」ではないのはなぜですか?

文字列をファイルに 2 回書き込む場合:

f = open("J:\\111.txt", "w+")
f.write(u"\u0638".encode('utf-16'))
f.write(u"\u0638".encode('utf-16'))
f.close()

ファイルの 16 進表現には、バイト オーダー マーク (BOM) \xff\xfe が2 回含まれています: FF FE 38 06 FF FE 38 06

UTF-16 でエンコードされた文字列で BOM を書き込まないようにするテクニックは何ですか?

4

3 に答える 3

5

ASCII 文字8は 16 進表記0x38です。だからあなたの文字列:

\xff\xfe8\x06

長さは4バイトです。スペースで区切られたバイトは次のとおりです。

\xff \xfe 8 \x06

Python は、\x印刷可能な ASCII 文字を表さないバイトの表記を使用します。

于 2012-06-25T21:14:04.370 に答える
3

「utf-16le」または「utf-16be」(リトル エンディアンまたはビッグ エンディアン) へのエンコードは、BOM の書き込みをスキップする必要があります。もちろん、BOM がなければ、デコーダは期待するエンディアンを知る必要があります。

于 2012-06-25T21:21:02.783 に答える
1

\xff\xfe8\x06 含まれています\x388== \x38

2 番目の質問については、BOM を回避するために、(UTF-16BEまたはUTF-16LEコーデックを使用して) エンディアンを明示している場合、BOM は出力されません。

ただし、正しいことは、エンコードとデコードを処理するファイル ラッパーを使用し、プログラムで unicode を使用することです。Python 3.0 では、open組み込み関数で次のことができます。

fp = open(filename, 'w', encoding='utf-16')
fp.write(u'write one line\n')
fp.write(u'write another line\n')
fp.close()

Python 2.x では、コーデック ラッパーを使用します。

fp = codecs.open(filename, 'w', 'utf-16')
fp.write(u'write one line\n')
fp.write(u'write another line\n')
fp.close()
于 2012-06-25T21:43:52.470 に答える