繁体   English   中英

从python中的字符串中剥离前两个字节

[英]Strip first two bytes from a string in python

我需要从字符串中删除字节顺序标记。 我已经有了找到BOM的代码,但是现在我需要从实际字符串中删除它。

举个例子。 BOM为feff ,长度为2个字节,这意味着字符串的前两个字节不应出现在最终字符串中。 但是,当我使用Python字符串剥离时,会从字符串中剥离太多。

程式码片段:

print len(bom)
print as_hex(bom)
print string
print as_hex(string)
string = string[len(bom):]
print string
print as_hex(string)

输出:

2
feff
Organ
feff4f7267616e
rgan
7267616e

我希望得到的是:

2
feff
Organ
feff4f7267616e
Organ
4f7267616e

as_hex()函数仅将字符打印为十六进制( "".join('%02x' % ord(c) for c in bytes ))。

我认为您有一个unicode字符串对象。 (如果您使用的是Python 3,那么您肯定会这样做,因为它是唯一的字符串。)as_hex函数不会在第一个字符上打印出“ fe”,而在第二个字符上打印出“ ff”。 它为字符串中的第一个unicode字符输出“ feff”。 例如(Python 3):

>>> mystr = "\ufeffHello world."
>>> mystr[0]
'\ufeff'
>>> '%02x' % ord(mystr[0])
'feff'

您要么只需要删除一个unicode字符,要么将字符串存储在bytes对象中,然后删除两个字节。

(这并不能解释为什么len(bom)为2的原因,而且我看不到您的更多代码也无法分辨。我想bom是一个listbytes对象,而不是一个unicode字符串。)


上面的答案假设使用Python 3,但是我从您的打印语句中意识到您正在使用Python2。基于此,我猜bom是ASCII字符串,而string是unicode字符串。 如果使用print repr(x)而不是print x ,它将告诉您unicode和ASCII字符串之间的区别。

使用正确的编解码器,BOM将为您处理。 如果使用utf-8-sigutf16解码,则会删除领先的BOM。 用它们编码将添加BOM。 如果您不希望使用BOM,请使用utf-8utf-16leutf-16be

将文本数据读入程序时,通常应解码为Unicode,而在写入文件,控制台,套接字等时,则应编码为字节。

unicode_str = u'test'
utf8_w_bom = unicode_str.encode('utf-8-sig')
utf16_w_bom = unicode_str.encode('utf16')
utf8_wo_bom = unicode_str.encode('utf-8')
utf16_wo_bom = unicode_str.encode('utf-16le')
print repr(utf8_w_bom)
print repr(utf16_w_bom)
print repr(utf8_wo_bom)
print repr(utf16_wo_bom)
print repr(utf8_w_bom.decode('utf-8-sig'))
print repr(utf16_w_bom.decode('utf16'))
print repr(utf8_wo_bom.decode('utf-8-sig'))
print repr(utf16_wo_bom.decode('utf16'))

输出:

'\xef\xbb\xbftest'
'\xff\xfet\x00e\x00s\x00t\x00'
'test'
't\x00e\x00s\x00t\x00'
u'test'
u'test'
u'test'
u'test'

请注意,在解码时,如果没有BOM, utf16将采用本机字节顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM