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

#python #python-3.x #utf-8 #character-encoding

#python #python-3.x #utf-8 #кодировка символов

Вопрос:

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

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

Вывод:

 b'okul'
b'yxc4xb1lxc4xb1'
  

Ожидается:

 okul
yılı
  

Ответ №1:

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

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

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

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

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

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

 >>> b'%s' % bs
b'yxc4xb1lxc4xb1'
  

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

 # 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(("%sn" % item).encode('utf-8'))
  

Ответ №2:

 import codecs

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