Проблема кодировки (UTF-8) - PullRequest
       29

Проблема кодировки (UTF-8)

0 голосов
/ 21 апреля 2019

Я хочу написать текст из списка. Но кодирование не работает и пишет как биты.

with open('freq.txt', 'w') as f:
    for item in freq:
        f.write("%s\n" % item.encode("utf-8"))

Выход:

b'okul'
b'y\xc4\xb1l\xc4\xb1'

Ожидаемое:

okul
yılı

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Если вы используете Python3, вы можете объявить желаемую кодировку в вызове open :

with open('freq.txt', 'w', encoding='utf-8') as f:
    for item in freq:
        f.write("%s\n" % item)

Если вы не предоставите кодировку, по умолчанию будет использоваться кодировкавозвращается locale.getpreferredencoding () .

Проблема с вашим кодом в том, что '%s\n' % item.encode('utf-8') кодирует item как байты, но затем операция форматирования строки неявно вызывает str в байтах, что приводит к использованию байтов repr для построения строки.

>>> s = 'yılı'
>>> bs = s.encode('utf-8')
>>> bs
b'y\xc4\xb1l\xc4\xb1'
>>> # See how the "b" is *inside* the string.
>>> '%s' % bs
"b'y\\xc4\\xb1l\\xc4\\xb1'"

Создание строки формата bytes литерал позволяет избежать этой проблемы

>>> b'%s' % bs
b'y\xc4\xb1l\xc4\xb1'

но тогда запись в файл не удастся, потому что вы не можете записать байты в файл, открытый в текстовом режиме.Если вы действительно хотите кодировать вручную, вам нужно сделать это:

# Open the file in binary mode.
with open('freq.txt', 'wb') as f:
    for item in freq:
        # Encode the entire string before writing to the file.
        f.write(("%s\n" % item).encode('utf-8'))
0 голосов
/ 21 апреля 2019
import codecs

with codecs.open("lol", "w", "utf-8") as file:
    file.write('Okul')
    file.write('yılı')
...