Задать вопрос
Ответы пользователя по тегу Unicode
  • С чем связанна проблема кодировки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ответ.
    Это может быть связано с неправильной работой с кодировками.
    А именно перекодирование происходит:
    - не в ту кодировку
    - не из той кодировки.
    Обычно неопытные программисты не хотят разбираться с тем как правильно работать с кодировками и что такое юникод, а все проблемы решают методом тыка меняя код пока проблема не исчезнет. Из-за этого у них часто присходят преобразования по умолчанию, которые ломаются при смене операционной системы, при запуске другим спообом (из терминала, от имени другого пользователя, через крон...), при смене умолчаний (локали, настроек терминала, настроек БД).
    А ещё такие неопытные программисты до жути боятся сообщений об ошибках, но решать настоящие пролемы не хотят и гасят их в бесшумном режиме, отчего реальные проблемы маскируются под глобальныйми молчаливыми пустыми обработчиками ошибок. Это приводит к усложнению внутреннего поведения программы и вот таки вот случаям, как у вас.
    Когда у таких программистов возникают проблемы (а за ними дело не встанет), то эти программисты не описывают проблему детально, не показывают исходный код, не обрисовывают архитектуру своей системы, а просто спрашивают в чем может быть проблема.
    Исчерпывающий ответ на такой вопрос дать несложно. Вот он.
    Ответ написан
    Комментировать
  • Как получить человекопонятные символы в кодировке UTF-8?

    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 файл при записи, тогда таким образом он у вас откроется читабельно.
    Ответ написан