替换python中的多字节字符

问题描述 投票:1回答:1

我正在尝试用正常的空间替换从Word复制的不间断空间,但是对我来说似乎没有任何作用。

我已经尝试将此空间读取为Unicode和十六进制,然后将其替换为正常。根据https://unicode-table.com/en/202F/,它是Narrow No-Break Space,但看起来这个空间是多个字符。

input.html看起来像这样(前面2x窄无间隙空间:]

  n

我的脚本:

with open('input.html', 'r+') as f:
    copy = f.read()

for line in copy:
    for char in line:
        print(char, hex(ord(char)), end = ' ')
        print(repr(char), ord(char))

提供输出:

â 0xe2 'â' 226
€ 0x20ac '€' 8364
Ż 0x17b 'Ż' 379
â 0xe2 'â' 226
€ 0x20ac '€' 8364
Ż 0x17b 'Ż' 379
n 0x6e 'n' 110

试图用:代替空格

copy.replace(u"\u202f", ".")
copy.replace("\0xe2\0x20ac\0x17b", ".")
copy.replace(' ', '.')

还有更多配置,但似乎没有任何实际作用。

我想将所有不间断空格作为html文件中的普通空格,但是我不知道该怎么做。

编辑:

替换空格:

copyb = bytes(copy, 'utf8')
copyb = copyb.replace(b'\xc3\xa2\xe2\x82\xac\xc5\xbb', b'.')

但是由于(如果我是对的)copyb是一个对象,所以我不明白为什么replace()在这种情况下不能以这种方式起作用(Python 3.7):

copyb = bytes(copy, 'utf8')
copyb.replace(b'\xc3\xa2\xe2\x82\xac\xc5\xbb', b'.')
python python-3.x unicode hex
1个回答
2
投票

此空格超过一个字符。

此空间大于一个byte。 UTF8字符可以为up to 4 bytes

字节与字符串

关于字符串对象和字节对象之间的区别似乎也有些混乱。 Eli Bendersky在the difference上有一篇不错的文章。要在字节对象中引用不可打印的字符,请在两个十六进制数字前加上\ x,例如'\ x12',而不是'\ 0x12'。

对于0xe2,您可能会想到一个hex数字,它是一个int表示形式:

>>> 0x10
16

替换狭窄的不间断空间

您的问题是关于替换此字符,所以让我们开始吧。

在字符串中

>>> mystr = 'a\u202fb'
>>> print(mystr)
a b
>>> mystr.replace('\u202f', '.')
'a.b'

在字节对象中

>>> mybytes = bytes('a\u202fb', 'utf8')
>>> print(mybytes)
b'a\xe2\x80\xafb'
>>> mybytes.replace(b'\xe2\x80\xaf', b'.')
b'a.b'
© www.soinside.com 2019 - 2024. All rights reserved.