Python 3.4 hex到日文字符

时间:2015-07-05 21:32:31

标签: python unicode encoding python-3.4

我目前正在编写一个脚本来从我的网站上提取包含日文字符的信息。到目前为止,我有我的脚本从网站上提取数据。

它以字符串形式返回:

"\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(),所以我尝试将其转换为字节对象并以这种方式解码,但仍然失败。

编辑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 个答案:

答案 0 :(得分:7)

您将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将代码点一对一地映射到字节,因此在这种数据的情况下通常可以安全地使用。可能是你在不同的编解码器中有一个Mojibake,这取决于你如何检索数据。

如果使用open()来读取文件中的数据,则指定了错误的encoding或依赖于您的平台默认值。使用open(filename, encoding='utf8')来解决这个问题。

如果您使用requests库从网站加载此内容,请考虑{a}}属性使用response.text作为默认编解码器,如果a)网站未指定编解码器和b)响应具有latin-1 mime类型。如果这是源自HTML,则通常编解码器是HTML标头的一部分。使用像BeautifulSoup这样的库来处理HTML(使用text/*原始字节),它会为你检测这些信息。

如果一切都失败了,ftfy library仍然可以修复Mojibake;它使用特殊构造的编解码器来反转常见错误。