1

Ubuntu で実行されている Python 2.7 では、このコード:

f = open("testfile.txt", "w")
f.write("Line one".encode("utf-16"))
f.write(u"\r\n".encode("utf-16"))
f.write("Line two".encode("utf-16"))

Gedit で読み取ると、2 行のテキストの間に必要な改行が生成されます。

Line one
Line two

ただし、同じコードを Windows 7 で実行してメモ帳で読み取ると、「1 行目」の後に判読できない文字が生成されますが、メモ帳では改行が認識されません。Ubuntu で得られる出力と一致するように、Windows で UTF-16 の正しい改行文字を書き込むにはどうすればよいですか?

Unicode UTF-16 のみを読み取る Windows 専用アプリケーションの出力を作成しています。さまざまなヒントを試すのに何時間も費やしましたが、メモ帳ではうまくいかないようです。Notepad でテキスト ファイルを UTF-16 に正常に変換できることは言及しておく価値がありますが、最初にスクリプトでエンコーディングを正しく保存することをお勧めします。

4

1 に答える 1

8

問題は、ファイルをテキスト モードで開いているのに、バイナリ ファイルとして使用しようとしていることです。

これ:

u"\r\n".encode("utf-16")

… にエンコードし'\r\0\n\0'ます。

次に、これ:

f.write('\r\0\n\0')

… Unix の改行を Windows の改行に変換し、'\r\0\r\n\0'.

もちろん、これは UTF-16 エンコーディングを壊します。2\r\nバイトが有効だが割り当てられていないコードポイント U+0A0D にデコードされるという事実に加えて、これは奇数のバイトであり、残りの\0. したがって、L\0次の文字ではなく\0L、 、別名などです。

それに加えて、エンコードされた文字列ごとに新しい UTF-16 BOM を作成している可能性があります。ほとんどの Windows アプリは実際にはそれを透過的に処理して無視するため、実際に行っているのは 1 行あたり 2 バイトを浪費しているだけですが、実際には正しくありません。


最初の問題をすばやく解決するには、ファイルをバイナリ モードで開きます。

f = open("testfile.txt", "wb")

これは複数の BOM の問題を解決しませんが、壊れた\n問題は解決します。BOM の問題を解決したい場合は、ステートフル エンコードを使用するか、最初の書き込み以外のすべての書き込みに対して'utf-16-le'(または) を明示的に指定します。'utf-16-be'


しかし、両方の問題に対する簡単な修正は、モジュール (または、古い Python 2.x の場合はモジュール) を使用して、すべての面倒な作業を行うことです。iocodecs

f = io.open("testfile.txt", "w", encoding="utf-8")
f.write("Line one")
f.write(u"\r\n")
f.write("Line two")
于 2013-06-18T01:20:59.107 に答える