@rkfddf

Как получить человекопонятные символы в кодировке UTF-8?

Вот таким кодом
with open ('grace.csv', 'a', 'utf-8') as csv_file:
                writer  = csv.writer(csv_file, delimiter=';')
                writer.writerow([name_title,  city, price, descrip])

записываю кирилицу в csv файл. Получается действительно в кодировке utf-8', только она не читаемая для человека, - получается что то вроде Продам участок - 35.
Есть способ решить эту проблему?
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
@andro1
?
На первой строке кода напиши: # -*- coding: utf-8 -*-
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@galaxy
получается что то вроде Продам участок - 35

Экселем читаете?
Ему кодировку надо указывать при импорте csv
Ответ написан
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Продам участок - 35

это выглядит, будто вы смотрите на utf-8 через неправильно настроенный просмотрщик, который пытается читать текст, будто он в 1251 кодировке.

Давайте объясню. Unicode - это не кодировка, это просто номенклатура большого количества самых разных символов. Этих символов сильно больше чем 256, а именно столько (256) значений может быть записано одним байтом.
Напомню. что у нас в компьютерах всё хранится в виде байтов и их последовательностей. Но один байт - это слишком мало для вычислений, поэтому их объединияли в "слова". Короче сперва регистры в процессоре были 2 байта (16 бит), потом 4 байта (32 бит), сейчас повсеместно завоёвывает позиции 64-битная архитектура. Грубо говоря это значит, что одной операцией процессор обрабатывает вот эти вот 4 или 8 байт. Но в каком порядке идут эти байты в такой группе? Вот тут тоже есть разница на разных платформах и там вообще мрак. Но как-то с этим живем.

Итак, нужно байтами записывать символы, которых очень много. Надо, чтобы эти байты можно было передать по сети другому компьютеру, возможно с другой архитектурой и другим порядком байт в "слове". Многим не нужны вообще все символы. Кому-то хватает только английских букв/цифр и некоторых знаков -- такой набор не превышает числом 128 символов (ASCII кодировка).
Что такое кодировка? Это способ задать одним или несколькими байтами конкретный символ. У кодировок разные наборы этих символов. Текст - это последовательность символов. В конкретной кодировке он задаётся последовательностью байт. Чтобы прочитать текст, нужно знать в какой он кодировке, брать байты (зная кодировку мы понимаем какие символы им соответствуют) и рисовать символы.

Исторически сложилось, что в windows в русской локали используется сразу две разных однобайтовых кодировки: cp1251 и cp866. Первая половина из 256 символов в них одинаковая, как в ASCII, а во второй русские буквы на совершенно разных местах стоят. Текст из одной кодировки в другую перевести можно однозначно, но нужно менять номера по специальной таблице.

А потом люди захотели очень разных символов, всякие иероглифы и пиктограммы. Это всё не поместится в байт и появились много байтовые кодировки. ASCII-символы там кодируются одним байтом, часто употребимые двумя, тремя, редкие, могут потребовать и больше байт. Есть сложный алгоритм, который говорит как превратить Юникод-символ с номером таким-то в набор байтов. Для каждой кодировки этот алгоритм свой. Для однобайтовых кодировок он сильно проще.

Регулярно чередующиеся символы в вашей строке примера - это те самые вторые байты символов. Заметьте, что ascii-символы представлены однобайтово. Это utf-8, на которую смотрят как на 1251 или какую-то другую однобайтовую кодировку.
То есть пытаются представить каждый байт в виде отдельного символа.

В итоге.
У вас есть файл в UTF-8. Открывайте его правильным редактором с правильными настройками и будет у вас всё видно правильно. Либо кодируйте в cp1251 файл при записи, тогда таким образом он у вас откроется читабельно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы