gpt4 book ai didi

python - 在 Windows 记事本的 Python 中创建 UTF-16 换行符

转载 作者:可可西里 更新时间:2023-11-01 10:56:18 60 4
gpt4 key购买 nike

在 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 中阅读时在两行文本之间生成所需的换行符:

Line one
Line two

但是,在 Windows 7 中执行并在记事本中读取的相同代码会在“第一行”后产生无法理解的字符,但记事本无法识别换行符。如何在 Windows 中为 UTF-16 编写正确的换行符以匹配我在 Ubuntu 中获得的输出?

我正在为仅读取 Unicode UTF-16 的 Windows 应用程序编写输出。我花了几个小时尝试不同的技巧,但似乎对记事本不起作用。值得一提的是,我可以直接在记事本中将文本文件成功转换为 UTF-16,但我宁愿让脚本首先正确保存编码。

最佳答案

问题是您以文本模式打开文件,但试图将其用作二进制文件。

这个:

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 编码。除了两个 \r\n 字节将解码为有效但未分配的代码点 U+0A0D 之外,这是奇数字节,这意味着您有剩余的 \0。因此,下一个字符不是 L\0,而是 \0L,又名 ,依此类推。

最重要的是,您可能正在为每个编码字符串编写一个新的 UTF-16 BOM。大多数 Windows 应用程序实际上会透明地处理并忽略它们,因此您实际上所做的只是浪费两个字节/行,但这实际上并不正确。


第一个问题的快速修复是以二进制模式打开文件:

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

这不能解决多 BOM 问题,但可以解决损坏的 \n 问题。如果你想修复 BOM 问题,你要么使用状态编码,要么明确指定 'utf-16-le'(或 'utf-16-be' ) 对于除第一次写入之外的所有写入。


但是简单解决两个问题的方法是使用io模块(或者,对于旧的Python 2.x, codecs 模块)为您完成所有艰苦的工作:

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

关于python - 在 Windows 记事本的 Python 中创建 UTF-16 换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17159236/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com