LINUX.ORG.RU

Как заставить питон работать с utf8 смайликами

 


0

2

Пишу небольшой скрипт записи в файл, но столкнулся с внезапной проблемой. Текст получаю json'ом И в принципе могу с ними сразу работать как с строками, если бы не одно но, спасибо смайликам в UTF-8 из-за который получаю ошибку

UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f60a' in position 8: character maps to <undefined>

Как это можно исправить?

Локаль в системе какая? И в какой кодировке открыт файл, в который ты выводишь (если локаль не UTF-8, надо нечто вроде with open(path, 'w', encoding='UTF-8') as f: ...)?

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от proud_anon

Локаль должна быть UTF-8 а возможности что бы не только с файлом работать? На всякий случай уточню что json получаю с вебсервера, потом записываю в файл, проблема есть как при записи в файл, так и при попытке загнать в переменную

MadMandarin
() автор топика
Ответ на: комментарий от proud_anon

При попытке просто выводить в консоль пишет:

UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 8-8: Non-BMP character not supported in Tk
MadMandarin
() автор топика
Ответ на: комментарий от MadMandarin

UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 8-8: Non-BMP character not supported in Tk

Так ты выводишь не в консоль, а в Tk.

Можно попробовать такую функцию, она заменит тебе все non-BMP-символы на их коды:

def replace_astral(строка):
    s = list(строка)
    for i in range(len(s)):
        c = ord(s[i])
        if c > 0xFFFF:
            s[i] = '[U+{:X}]'.format(c)
    return ''.join(s)
(можно переписать в одну строку при помощи map и lambda, но лучше не надо)

Кроме того, в тред призывается любитель юникодных смайликов в Питоне ValdikSS.

proud_anon ★★★★★
()
Ответ на: комментарий от MadMandarin

Сейчас перепроверю, насколько помню bytes

Тогда у тебя должно быть «TypeError: Can't convert 'bytes' object to str implicitly».

Какая вообще у тебя версия Python и операционная система?

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Хм, странно, ошибка при записи в переменную пропала, точнее она там была из-за того что я эту переменную потом пытался записать в файл.

MadMandarin
() автор топика
Ответ на: комментарий от proud_anon

Спасибо за помощь, с replace_astra заработало, жаль терять смайлы но пока и без них обойдусь.

MadMandarin
() автор топика
Ответ на: комментарий от proud_anon
UnicodeEncodeError: 'charmap' codec can't encode character '\u263a' in position 29: character maps to <undefined>

Что-то всё же странно творится с этим юникодом

MadMandarin
() автор топика
Ответ на: комментарий от MadMandarin

Хм, странно, ошибка при записи в переменную пропала, точнее она там была из-за того что я эту переменную потом пытался записать в файл.

Тогда поставить диагноз довольно просто:

  1. Проблема при выводе в файл возникает потому, что файл почему-то открыт не в кодировке UTF-8. Может, у тебя локаль всё-таки не UTF-8 в системе? Но в любом случае, заставить Питон открыть файл вне зависимости от локали в нужной кодировке можно с помощью параметра encoding для open.
  2. Проблема при работе с Tk возникает потому, что выводить в Tk символы вне BMP нельзя. Либо напиши консольный интерфейс, либо воспользуйся другим тулкитом для GUI, либо используй replace_astral.
proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от MadMandarin

Что-то всё же странно творится с этим юникодом

replace_astral поможет тебе только от проблемы номер 2, но не от проблемы номер 1.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

С явным указанием заработало, ещё раз спасибо, боюсь долго мучался бы без помощи.

MadMandarin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.