如何使用现有的Unicode字符转换字符串类型?

时间:2018-11-26 01:01:28

标签: python unicode python-2.x

使用python 2.7,我有一个端点,该端点返回包含字符'\ u2019','\ u2018'和'\ u2026'的字符串。我无法通过编码,解码等的任何组合来解决这些问题。

实际的字符串如下所示: “ \ u2018Ralph打破了互联网\ u2019和\ u2018Creed II \ u2019成为感恩节热门”

这是一个代码段

#!/usr/bin/python
# -*- coding: utf-8 -*-
...
>>> '\u2019'.encode('ascii')
'\\u2019'
>>> '\u2019'.encode('utf-8')
'\\u2019'
>>> '\u2019'.decode('utf-8')
u'\\u2019'
>>>'\u2019'.decode('ascii')
u'\\u2019'

我正在运行命令行,但也尝试输出到文件无济于事。在这些类型的问题上有许多类似的线索,但是还没有找到一种可行的方法。我想我可以进行某种正则表达式字符查找和替换,但这似乎很笨拙。

3 个答案:

答案 0 :(得分:1)

您是否检查过此线程:Removing \u2018 and \u2019 character

这些是Unicode引号字符。

  

u“ \ u2018Ralph中断了互联网\ u2019和\ u2018Creed II \ u2019 Are   感恩节热门”

返回:
“ Ralph破坏了互联网”和“ Creed II”是感恩节热门歌曲”

希望这会有所帮助。

答案 1 :(得分:0)

我赞成@Ying Cai,但我会给你一些提示: 如果在使用from __future__ import unicode_literals时添加Python 2.7,则整个文件将被视为Python 3.X,这意味着所有字符串文字将被视为unicode。如果您在Python 2.7上并且使用u"\u2018Ralph Breaks the Internet\u2019 and \u2018Creed II\u2019 Are Thanksgiving Hits"而不添加from __future__ import unicode_literals,则该字符串现在为unicode,它将按预期工作。

@Mark我刚刚更新了答案,因为我确实在考虑from __future__ import unicode_literals而不是# -*- coding: utf-8 -*-。感谢您的评论。

答案 2 :(得分:0)

您需要3件事才能在Python 2上打印非ASCII字符。

  • 使用print
  • 终端编码必须支持字符。
  • 字体必须支持以下字符:

示例(使用代码页437的Windows控制台):

C:\>py -2
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> u'\u2018Ralph\u2019'     # Didn't use `print`
u'\u2018Ralph\u2019'
>>> print u'\u2018Ralph\u2019'  # cp437 doesn't support these characters.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2018' in position 0: character maps to <undefined>
>>> ^Z

将代码页更改为支持字符的页面:

C:\>chcp 1252
Active code page: 1252

C:\>py -2
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print u'\u2018Ralph\u2019'
‘Ralph’

请注意,最新的Python 3的工作方式有所不同。代码页无关紧要(但字体无关紧要):

C:\>py -3
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> '\u2018Ralph\u2019'
'‘Ralph’'
>>> print('\u2018Ralph\u2019')
‘Ralph’
>>> print(ascii('\u2018Ralph\u2019'))  # Old behavior to see escape codes.
'\u2018Ralph\u2019'