Python 3.x 关于UTF8子串长度的混淆
有人能帮我处理XHTML文件第一行中的字节顺序标记(BOM)字节和UTF8字符吗 使用Python 3.5,我以UTF8文本的形式打开了XHTML文件:Python 3.x 关于UTF8子串长度的混淆,python-3.x,utf-8,byte-order-mark,Python 3.x,Utf 8,Byte Order Mark,有人能帮我处理XHTML文件第一行中的字节顺序标记(BOM)字节和UTF8字符吗 使用Python 3.5,我以UTF8文本的形式打开了XHTML文件: inputTopicFile = open(inputFileName, "rt", encoding="utf8") 如此十六进制编辑器所示,UTF8编码的XHTML文件的第一行以三个字节的UTF8 BOMEF BB BF开始: 我想从我认为相当于字符串中三个初始字符位置[0:2]的位置删除UTF8 BOM。所以我试了一下: firstL
inputTopicFile = open(inputFileName, "rt", encoding="utf8")
如此十六进制编辑器所示,UTF8编码的XHTML文件的第一行以三个字节的UTF8 BOMEF BB BF
开始:
我想从我认为相当于字符串中三个初始字符位置[0:2]
的位置删除UTF8 BOM。所以我试了一下:
firstLine = firstLine[3:]
不起作用——正如您在编辑中提到的字符
,您可以使用utf8 sig
编码打开文件,但要回答您的问题,即为什么会出现这种情况:
Python 3区分字节字符串(带b
前缀的字符串)和字符串(不带b
前缀),并尽可能使用字符串。字节字符串与实际字节一起工作;字符串与Unicode代码点配合使用。BOM是一个单代码点,U+FEFF,因此在常规字符串中,Python 3将其视为单个字符(因为它是单个字符)。调用encode
时,将字符串转换为字节字符串
因此,您看到的结果正是您应该看到的:Python3确实知道什么是单个字符,这是在您调用encode
之前它所看到的全部内容,您实际上是如何打开文件的?Python3不会给你字节,除非你要求它们。@josh lee我用我用来回答这个问题的文件打开方法编辑过。还添加了第二个循环,使用.encode查看我得到的结果。尝试使用utf8 sig
编码代替(它将为您删除字节顺序标记)。BOM工作的部分原因是它是单个Unicode字符的编码(U+FEFF,零宽度无中断空间)。这就是Python将其视为单个字符的原因:因为它是单个字符。
for charPos in range(0, 3):
print("charPos {0} == {1}".format(charPos, firstLine[charPos]))
charPos 0 ==
charPos 1 == <
charPos 2 == ?
for charPos in range(0, 3):
print("charPos {0} == {1}".format(charPos, eachLine[charPos].encode('utf8')))
charPos 0 == b'\xef\xbb\xbf'
charPos 1 == b'<'
charPos 2 == b'?'
inputTopicFile = open(inputFileName, "rt", encoding="utf-8-sig")