Як надрукувати символ Unicode в Python?


115

Я хочу скласти словник, де англійські слова вказують на російський та французький переклади.

Як надрукувати символи Unicode в Python? Крім того, як ви зберігаєте символи Unicode у змінній?


Чи допомагає це: docs.python.org/howto/unicode.html
paulsm4

Погляньте тут . Префіксація ваших рядків за допомогою uдозволяє python вважати їх буквами unicode.
НДІ

Відповіді:


109

Щоб включити символи Unicode у свій вихідний код Python, ви можете використовувати символи Esicode Escode у формі \u0123у вашому рядку та префікс рядкового букваря з "u".

Ось приклад роботи в інтерактивній консолі Python:

>>> print u'\u0420\u043e\u0441\u0441\u0438\u044f'
Россия

Рядки, оголошені таким чином, є змінними типу Unicode, як описано в документації на Python Unicode .

Якщо запущена вищевказана команда не відображає текст правильно для вас, можливо, ваш термінал не здатний відображати символи Unicode.

Для отримання інформації про зчитування даних Unicode з файлу див. Цю відповідь:

Читання персонажа з файлу в Python


4
Так, ви можете написати свій код у текстових файлах, кодованих Unicode, але у багатьох редакторів та інструментів виникають проблеми з ними. Мій досвід роботи з вихідним кодом на багатьох різних платформах полягав у тому, що найкраще зберігати вихідний код у ASCII та використовувати уникнення Unicode.
Метт Райал

3
@MattRyall, я погоджуюся, але команда російських розробників може захотіти писати коментарі та документи на російській мові. Для мовного проекту це хороший варіант.
Йохан Лундберг

3
Хоча зауважте, що це працює лише якщо ви надрукуєте лише рядок. Якщо він загорнутий в якийсь інший об'єкт, ви побачите коди втечі. Спробуйте, наприклад, "print [u '\ u0420 \ u043e \ u0441 \ u0441 \ u0438 \ u044f']".
шпильки

3
Що робити, якщо я зберігаю його в рядку mystr? то як її роздрукувати?
cqcn1991

1
@CarloWood Верхня відповідь говорить вам саме про те, що ви хочете. Простоprint your_unicode_characters.encode('utf-8')
Юхао Чжан

48

Друк символу Unicode в Python:

Друк символу unicode безпосередньо з інтерпретатора python:

el@apollo:~$ python
Python 2.7.3
>>> print u'\u2713'

Символ Unicode u'\u2713'- це галочка. Перекладач друкує галочку на екрані.

Друк символу unicode із сценарію python:

Помістіть це в test.py:

#!/usr/bin/python
print("here is your checkmark: " + u'\u2713');

Виконайте це так:

el@apollo:~$ python test.py
here is your checkmark: 

Якщо він не показує галочку для вас, проблема може бути в іншому місці, як-от налаштування терміналу або щось, що ви робите з перенаправленням потоку.

Збереження символів unicode у файлі:

Збережіть це у файлі: foo.py:

#!/usr/bin/python -tt
# -*- coding: utf-8 -*-
import codecs
import sys 
UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)
print(u'e with obfuscation: é')

Запустіть його та виведіть трубку у файл:

python foo.py > tmp.txt

Відкрийте tmp.txt і загляньте всередину, ви побачите це:

el@apollo:~$ cat tmp.txt 
e with obfuscation: é

Таким чином, ви зберегли unicode e із позначкою обфускування на ньому у файл.


@ ofer.sheffer химерно Я тут шукаю, щоб вирішити протилежну проблему, справа в тому, що це може зайняти деяку хитрування.
Кріс Н

40

Якщо ви намагаєтеся print()Unicode та отримуєте помилки кодека ascii , перегляньте цю сторінку , TLDR якої робимо export PYTHONIOENCODING=UTF-8перед запуском python (ця змінна регулює, яка послідовність байтів консолі намагається кодувати ваші рядкові дані). Внутрішньо Python3 використовує UTF-8 за замовчуванням (див . Unicode HOWTO) тож це не проблема; ви можете просто поставити Unicode в рядки, як це видно в інших відповідях та коментарях. Саме тоді, коли ви намагаєтеся отримати ці дані на консоль, виникає проблема. Python вважає, що ваша консоль може працювати лише з ascii. Деякі з інших відповідей говорять: "Спочатку запишіть його у файл", але зауважте, що вони для цього вказують кодування (UTF-8) (так, Python нічого не змінює в письмовій формі), а потім використовують метод для читання файл, який просто виплескує байти, не враховуючи кодування, тому це працює.


Дякую! У мене виникла проблема unicde під час використання пакету asciitree для запису результатів у файл. Це вирішило це для мене.
Pål Thingbø

Дуже дякую. Провели години гуління, радий, що знайшов це.
CharlyDelta

17

У Python 2 ви оголошуєте рядки unicode з a u, як у, u"猫"і використовуйте decode()та encode()перекладаєте на unicode і відповідно.

Це зовсім небагато простіше в Python 3. Дуже хороший огляд можна знайти тут . Ця презентація прояснила багато речей для мене.


1
Thx для відеопосилання. Це дуже корисно.
arun

1
Це також доступне як без відео тут: Прагматичний Unicode, або: Як я зупиняю біль? (Pycon2012) nedbatchelder.com/text/unipain.html
Том

7

Враховуючи, що це перший результат переповнення стека під час пошуку Google за цією темою, зазначається, що uв Python 3. префіксування рядків unicode необов’язкове (приклад Python 2 був скопійований з верхньої відповіді)

Python 3 (обидві роботи):

print('\u0420\u043e\u0441\u0441\u0438\u044f')
print(u'\u0420\u043e\u0441\u0441\u0438\u044f')

Пітон 2:

print u'\u0420\u043e\u0441\u0441\u0438\u044f'

Дякую! Саме те, що я шукав: універсальний спосіб друкувати символ unicode всередині рядка як для python2, так і python3.
JenyaKh

затискана версія повинна працювати і в Phyton 2 - затискачі є варіантом і таким чином дозволені.
Олександр Стор

4

Я використовую портативний winpython в Windows, він включає консоль IPython QT, я міг досягти наступного.

>>>print ("結婚")
結婚

>>>print ("おはよう")
おはよう

>>>str = "結婚"


>>>print (str)
結婚

Ваш консольний інтерпретатор повинен підтримувати unicode, щоб показати символи unicode.


3

Ще одна річ, яка ще не додана

У Python 2, якщо ви хочете надрукувати змінну, яка містить unicode та use .format(), зробіть це (зробіть базову рядок, який форматується, рядок unicode із u'':

>>> text = "Université de Montréal"
>>> print(u"This is unicode: {}".format(text))
>>> This is unicode: Université de Montréal

3

Це виправляє друк UTF-8 в python:

UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.