【问题标题】:String Encodings IDNA -> UTF-8 (Python)字符串编码 IDNA -> UTF-8 (Python)
【发布时间】:2016-12-09 19:10:33
【问题描述】:

字符串编码和格式总是让我失望。

这是我所拥有的:

'ไทย'

我认为是 UTF-8,并且

'xn--o3cw4h'

这在 IDNA 编码中应该是一样的。但是,我不知道如何让 python 从一种转换为另一种。

我只是在尝试

a = u'xn--o3cw4h'
b = a.encode('idna')
b.decode('utf-8')

但我得到了完全相同的字符串('xn--o3cw4h',虽然不再是 unicode)。我目前使用的是 python 3.5。

【问题讨论】:

  • 你使用的是 Python2 还是 Python3?
  • 我可以推荐nedbatchelder.com/text/unipain.html 吗?我发现它对于任何在 Python 中遇到 Unicode 问题的人来说都是无价的。
  • 我很乐意接受任何关于该主题的良好解释的建议。

标签: python string encoding character-encoding


【解决方案1】:

要将一种编码转换为另一种编码,必须先将字符串解码为 Unicode,然后再以目标编码对其进行编码。

所以,例如:

idna_encoded_bytes = b'xn--o3cw4h'
unicode_string = idna_encoded_bytes.decode('idna')
utf8_encoded_bytes = unicode_string.encode('utf-8')

print (repr(idna_encoded_bytes))
print (repr(utf8_encoded_bytes))
print (repr(unicode_string))

Python2 结果:

'xn--o3cw4h'
'\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2'
u'\u0e44\u0e17\u0e22'

可以看到,第一行是ไทย的IDNA编码,第二行是utf8编码,最后一行是Unicode码位U-0E44、U-0E17、U-0E22的未编码序列.

要一步完成转换,只需链接操作:

utf8_encoded_bytes = idna_encoded_bytes.decode('idna').encode('utf8')

回复评论:

我开始的不是 b'xn--o3cw4h' 而是字符串 'xn--o3cw4h'。 [在 Python3 中]。

你有一只奇怪的鸭子。您已将明显编码的数据存储在 unicode 字符串中。我们需要以某种方式将其转换为bytes 对象。一个简单的方法是使用(令人困惑的)ASCII 编码:

improperly_encoded_idna = 'xn--o3cw4h'
idna_encoded_bytes = improperly_encoded_idna.encode('ascii')
unicode_string = idna_encoded_bytes.decode('idna')
utf8_encoded_bytes = unicode_string.encode('utf-8')

print (repr(idna_encoded_bytes))
print (repr(utf8_encoded_bytes))
print (repr(unicode_string))

【讨论】:

  • 但没有一个真正吐出'ไทย'
  • 对,因为我正在打印对象的repr() 形式以明确它们是什么。如果您只想让ไทย 出现在标准输出上,请执行print (unicode_string)
  • 我仍然缺少一些东西。我开始的不是 b'xn--o3cw4h' 而是字符串 'xn--o3cw4h'。
猜你喜欢
  • 2014-06-09
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多