【问题标题】:Transform unicode \xe9 to é (python 2.7) [duplicate]将 unicode \xe9 转换为 é (python 2.7) [重复]
【发布时间】:2018-08-29 03:06:00
【问题描述】:

我正在尝试转换这个 unicode 值:

string_value = u'd\xe9cid\xe9'

到

string_value = u'décidé'

我觉得我什么都试过了:

decoded_str = string_value.decode('utf-8')

或

string_value = str(string_value)
decoded_str = string_value.encode('latin1').decode('utf-8')

或

string_value = string_value.decode('latin-1')

这个结果是:

d\xc3\xa9cid\xc3\xa9

如果我这样做,我会得到相同的结果:

string_value = string_value.encode('utf-8')

我读过: How do I convert 'blah \xe9 blah' to 'blah é blah'

也来自: Why does Python print unicode characters when the default encoding is ASCII?

和: How do I convert a unicode to a string at the Python level?

编辑:

我的问题是我需要使用数据,我的意思是如果我有:

string_value = u'mai 2017 \u2013 Aujourd\u2019hui'

这是:

2017 年 5 月 – Aujourd'hui

我想做:

string_list = string_value.split('-')

但结果是:

[u'mai 2017 \u2013 Aujourd\u2019hui']

我会:

['mai 2017', 'Aujourd’hui']

新编辑:

感谢您的回答,我知道我走错了方向。 \xe9 是 'é' 的正确表示,这不是问题。 我真正的问题是为什么 json.loads() 将 'mai 2017 – Aujourd'hui' 转换为 'mai 2017 \u2013 Aujourd\u2019hui' ?

【问题讨论】:

  • 为什么要关心字符串在源代码中的表示方式?当你print它时它不会正确输出吗?
  • string_value = string_value.encode('utf-8') 在 python2.7 中为我工作
  • u'd\xe9cid\xe9' 已经代表u'décidé'。你不需要做任何事情。
  • 感谢您的回答@usr2564301,问题是我需要格式化数据。例如,我有这个 unicode u'mai 2017 \u2013 Aujourd\u2019hui',即'mai 2017 – Aujourd'hui',我想在'-'处拆分它,但它不起作用。我正在用这个例子编辑我的问题
  • - 与 – (\u2013) 完全不同。

标签: python python-2.7 decode encode python-unicode


【解决方案1】:

我不确定你在问什么:\xe9 是代码点 233 的表示(e9 十六进制),which simply is the letter "é":

>>> u'é' == u'\xe9'
True

您的困惑可能源于 Python 字符串的 repr 是(在 Python 2 中)ASCII 格式,因此非 ASCII 字符会被转义。如果您没有明确使用print,Python 控制台会使用repr 显示一个值:

>>> print(repr(u'é'))
u'\xe9'

>>> print(repr(u'\xe9'))
u'\xe9'

但是,当您打印该值时,不会发生转换并且一切都按预期工作:

>>> print(u'é')
é

>>> print(u'\xe9')
é

另请注意,在 Python 3 中,repr 返回 Unicode:

Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print(repr(u'\xe9'))
'é'

问题编辑后更新:

正如 cmets 中所指出的,\u2013 与 - 不是同一个字符(就像 a 和 b 是单独的字符一样)。因此,您需要在 \u2013 上拆分,而不是在 - 上拆分。

【讨论】:

  • 非常感谢@Florian 的回答,我已经编辑了我的问题以更好地解释为什么对我来说是个问题
  • 查看我的更新。
  • 好的,谢谢,我现在完全理解了,但是有一个新问题:为什么 json.loads() 用 \u 替换 ' 或 - ?
  • 如果其他问题与原始问题没有密切关系(这个问题不是),请将它们作为新帖子发布。
  • @PAscalinox:确实,为什么会这样?最好的猜测是它确实不这样做。
【解决方案2】:

splitting a string with a unicode delimiter?

所以...

print string_value.split(u"\u2013")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2015-09-14
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多