Как я могу преобразовать строковый тип с существующими символами Unicode? - PullRequest
0 голосов
/ 26 ноября 2018

Используя python 2.7, у меня есть конечная точка, которая возвращает строки, содержащие символы '\ u2019', '\ u2018' и '\ u2026'.Я не смог разрешить их с помощью любой комбинации кодирования, декодирования и т. Д.

Фактические строки выглядят примерно так: "Хиты "

Вот фрагмент кода

#!/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 голосов
/ 26 ноября 2018

Я проголосовал за @Ying Cai, но я дам вам несколько советов: если вы добавите from __future__ import unicode_literals при использовании Python 2.7, весь файл будет обработан как Python 3.X, то есть все строковые литералы будутрассматривается как юникод.Если вы используете 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 -*-.Спасибо за ваш комментарий.

0 голосов
/ 27 ноября 2018

Вам нужно 3 вещи для печати не-ASCII символов на Python 2.

  • Использование print
  • Кодировка терминала должна поддерживать символы.
  • Шрифт должен поддерживать символы:

Пример (консоль Windows использует кодовую страницу 437):

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'
0 голосов
/ 26 ноября 2018

Вы проверили эту тему: Удаление символов \ u2018 и \ u2019

Это Unicode для символа кавычки.

u "\ u2018Ральф ломает Интернет \ u2018 и \ u2018Creed II \ u2019 - хиты благодарения"

возвращает:
'Ральф ломает Интернет' и 'Creed II 'Are Hits Благодарения'

Надеюсь, это поможет.

...