Python 3.4十六进制转日语字符

3

我目前正在编写一个脚本,从我的网站上获取包含日语字符的信息。目前为止,我的脚本已经成功地从网站上提取了数据。

它以字符串形式返回:

"\xe5\xb9\xb4\xe3\x81\xab\xe4\xb8\x80\xe5\xba\xa6\xe3\x81\xae\xe6\x99\xb4\xe3\x82\x8c\xe5\xa7\xbf" 

使用在线十六进制转文本工具,我得到的结果是:
年に一度の晴れ姿
我知道这个短语是正确的,但我的问题是如何在Python中进行转换?当我运行类似于以下代码的内容时:
name = "\xe5\xb9\xb4\xe3\x81\xab\xe4\xb8\x80\xe5\xba\xa6\xe3\x81\xae\xe6\x99\xb4\xe3\x82\x8c\xe5\xa7\xbf"
print(name)

我正在提供以下内容:

å¹´ã«ä¸åº¦ã®æ´ã姿

我尝试着去:

name.decode("hex")

但是似乎Python 3.4没有str.decode()这个函数,所以我尝试将其转换为bytes对象并以此解码,但仍然失败了。
编辑1:
如果您不介意,我还有一个跟进的问题:像Martijn Pieters提供的解决方案一样,这个解决方案有效:
name = "\xe2\x80\x9c\xe5\xa4\x8f\xe7\xa5\xad\xe3\x82\x8a\xe3\x83\x87\xe3\x83\xbc\xe3\x8‌​3\x88\xe2\x80\x9d\xe7\xb5\xa2\xe7\x80\xac \xe7\xb5\xb5\xe9\x87\x8c" 
name = name.encode('latin1') 
print(name.decode('Utf-8')) 

然而,如果我在文件中有引号内的名称,并执行以下操作:

with open('0N.txt',mode='r',encoding='utf-8') as f: 
    name = f.read() 
name = name.encode('latin1') 
print(name.decode('Utf-8')) 

它不起作用了...有什么想法吗?

1个回答

8
你将Python的 表示 与内容混淆了。你看到的是Python字符串字面值中使用的 \xhh 十六进制转义字符,以保持显示值的ASCII安全性和可重复性。
这里有UTF-8数据:
>>> name = b"\xe5\xb9\xb4\xe3\x81\xab\xe4\xb8\x80\xe5\xba\xa6\xe3\x81\xae\xe6\x99\xb4\xe3\x82\x8c\xe5\xa7\xbf"
>>> name.decode('utf8')
'\u5e74\u306b\u4e00\u5ea6\u306e\u6674\u308c\u59ff'
>>> print(name.decode('utf8'))
年に一度の晴れ姿

请注意,我在那里使用了一个bytes()字符串字面量,使用b'...'。如果您的数据不是一个bytes对象,那么您会遇到Mojibake问题,需要先进行编码转换为字节格式:
name.encode('latin1').decode('utf8')

Latin 1将码点一对一地映射到字节,因此通常在处理这种数据时使用它是安全的选择。可能是你有一个不同编码的乱码,这取决于如何检索数据。
如果使用open()从文件中读取数据,则可能未指定正确的encoding或依赖于您的平台默认值。使用open(filename,encoding='utf8')来解决这个问题。
如果您使用requests库从网站加载数据,请注意,如果a)网站没有指定编解码器并且b)响应具有text/* MIME类型,则response.text属性默认使用latin-1编解码器。如果源自HTML,则通常编解码器是HTML标头的一部分。使用类似BeautifulSoup的库处理HTML(使用response.content原始字节),它将为您检测此类信息。
如果所有其他方法都失败了,ftfy library可能仍然能够修复Mojibake;它使用特殊构造的编解码器来矫正常见的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接