Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 关于UTF8子串长度的混淆_Python 3.x_Utf 8_Byte Order Mark - Fatal编程技术网

Python 3.x 关于UTF8子串长度的混淆

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

有人能帮我处理XHTML文件第一行中的字节顺序标记(BOM)字节和UTF8字符吗

使用Python 3.5,我以UTF8文本的形式打开了XHTML文件:

inputTopicFile = open(inputFileName, "rt", encoding="utf8")
如此十六进制编辑器所示,UTF8编码的XHTML文件的第一行以三个字节的UTF8 BOM
EF 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")