Перекодировка текста (сборник кодов для различных кодовых страниц) | SafeZone – форум помощи

Введение

Мне очень нравится программировать, и в 1996 году я получил от этого свой первый доход. Но время от времени я пишу что-нибудь для автоматизации задач. О golang я узнал совсем недавно. Golang оказался очень полезным инструментом для разработки утилит. Итак.

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

Если в качестве разделителей используются только табуляции или пробелы, то данные выглядят почти как CSV.

А заголовок содержит описание данных и обычно содержит русский текст.

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

В конце концов, я остановился на golang и получил небольшую библиотеку с возможностью обнаружения страниц кода.

Кодировки. Как применяются кодировки текста? Начало кодирования. Стоит прочитать, если вы хотите узнать, что такое “крапинки” или “косточки”.

Мой ответ был написан. Затем я попытался использовать готовое решение в golang, но оно оказалось безуспешным. При попытке найти решение выявились два недостатка.

В некоторых кодировках оба варианта неверны. Стандартный он не учитывает текст, поэтому должен был быть разработан для html-страниц.

В процессе поиска я иногда обнаруживал готовые утилиты для Linux. Я обнаружил ее версию, 1.12, в WIN32. Также я прочитаю эту статью. Ах, в ней есть забавные вещи! Извините, но я ничего не знаю о Linux. Это значит, что есть еще решения, которые можно добавить в код golang. Это все, что мне нужно было найти!

Freedos

FreeDOS предоставляет дополнительные неофициальные расширения кодовой страницы 866 для различных неславянских языков:

  • 30002 – Циркистан Тайкистан
  • 30008 – Циркистан Абхазии и Осетии
  • 30010 – Циркистан Гагаузии и Молдавии
  • 30011 – Циркистан Северного региона России (Калмыкия, Карачаево-Балкария, Осетия, Кавказский Север)
  • 30012 – Цирилический язык русских районов Сибири и Крайнего Востока (Алтайский, Бурятский, Хакасский, Тувинский, Якутский, Тунгусский, Палеосибирский)
  • 30013 – Цирилический язык региона Волги – тюркские языки (башкирский, чувашский, тартаро)
  • 30014 – Цириликон региона Волги – финно-угорские языки (марийский, удмуртский)
  • 30015 – Цириликон ханты
  • 30016 – Цириликон манси
  • 30017 – Цириликон Нороксидентального района (цириликон ненецкого языка, карелиано латино , Латинский вепсиано )
  • 30018 – Цирилико латино тартаро и русо
  • 30019 – Цирилико латино чечено и русо
  • 58152 – Цирилико казахо с евро
  • 58210 – Цирилико азери
  • 59234 – Цирилико тартаро
  • 60258 – Цирилико латино азери и русо
  • 62306 – Цирилико узбеко

Lst 1284

Литовский стандарт LST 1284: 1993, также называемый “модифицированной” строкой 866 или кодовой страницей 1119. – рендеринг символов в литовских буквах (см. страницу 850 кода). В русском eme сохраняется русскоязычное написание “ё”, в отличие от KBL.

Он внесен на кодовую страницу 437 вместе с LST 1283 (кодовая страница 774/1118). Позднее вместо него был использован LST 1590-1 (кодовая страница 775), который содержит литовские буквы, но не содержит кириллицы.

Не модифицированная страница, а страница с кодом 866.

:/>  Как исправить хрипящий звук в Windows 10

Алгоритм

Когда я узнал, что коды KOI8-r и CP1251 совпадают, я грустил пару дней. Выяснилось следующее.

Основные решения

  1. Мы будем работать с байтовым срезом, для совместимости с charset.DetermineEncoding()
  2. Случаи кодировки UTF-8 и BOM проверяются отдельно
  3. Входные данные последовательно передаются каждой кодировке. Каждый из них в отдельности вычисляет два целочисленных критерия. Побеждает тот, у кого сумма двух критериев больше.

Альтернативная кодовая страница

Оригинальная кодовая страница, созданная Брябриным и коллегами. Альтернативная кодировка (1986) (Альтернативная кодировка на русском языке).

Поддерживает только русский и болгарский языки. Это то же самое, что и страница кодов 866 для кодов.

Затем символы были измененны на кодовой странице 866

Варианты

В различных итерациях кодовой страницы отличались только последние 16 точек (240-255).

Второй критерий

К сожалению, частота встречающихся букв составляет всего 1-3 раза для коротких случаев (длина русского текста составляет 5-6 символов). Пришлось добавить второе требование – подсчитывать количество пар согласных-гласных.

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

Гост р 34.303-92

Большинство КОИ-8 N2 (не путать с кодировкой, которая следует далее) соответствует альтернативной кодовой странице 866, а другая кодированная строка – последней строке в стандарте ГОСТ Р 34.303-92.

Последняя строка включает поддержку белорусских и украинских символов, но в раскладке отсутствуют кодовые страницы 866 и 1125. Альтернативная кодовая страница 866 содержит русский язык, а оригинальная – нет. Отображается следующая строка.

Кодовая страница 866 отличается от кодовой страницы 82, альтернативной версии.

Подмножество KOI-8, в котором не используются латинские кириллические буквы и смешанные однострочные прямоугольные символы, известно как KOI-8 N1; для сравнения см. кодовую страницу 850. Ниже приведено изображение затронутых строк.

Дальнейшее чтение

  • Корнай, Андрас ; Бирнбаум, Дэвид Дж ; да Круз, Фрэнк ; Дэвис, Бур ; Фаулер, Джордж ; Пэйн, Ричард Б . ; Paperno, Glory; Simonsen, Keld J.; Thobe, Glenn E. ; Вулис, Димитрий; ван Винген, Йохан В. (13 марта 1993). “FAQ по CYRILIC CODING” версия 1.3 . 1.3 . Пересмотрено 4 июня 2020 года .

Измененная кодовая страница 866

Неофициальная кодовая страница 437 обычно размещается на 240 и 241. В этой версии поддерживаются только русский и болгарский языки. Ниже приведено изображение второго ряда.

Кодовая страница 900

До того, как окончательная кодовая страница Microsoft для русской версии MS-DOS 4.01 была зарегистрирована Францем Рау в IBM под именем CCP866 в январе 1990 года, существовали черновые варианты ее текстовой версии.

Из Dialogue, все еще кодовая страница 900 в компании. Документация была скорректирована, чтобы отразить новое название перед выпуском продукта.

Латышский вариант

Латышский вариант, поддерживаемый принтерами Star и FreeDOS, – это кодовая страница 3012 . Эта кодировка получила название «РусЛат».

Версия 464 отличается от кодовой страницы 866.

Ленер – чешская модификация

Неофициальная модификация, используемая в программах Михаэля Ленера и Питера Р. Чеха Она заменяет три математических символа на кирки и знак сечения, которые обычно используются в русском языке.

Другие альтернативные наборы символов, включая один, основанный на CWI-2, также были произведены Lehner и Czech для использования с другими европейскими языками. Измененные серии представлены ниже.

:/>  Как убить процесс с помощью командной строки в Windows 10

Кодовая страница 866 отличается от кодовой страницы 865

Наблюдение 1

Без BOM enca не может распознать кодировку файла UTF-16LE. Это странно. Ничего не произошло, когда я попытался добавить больше текста.

Наблюдение 2. проблемы с кодировками cp1251 и koi8-r

15 и 16 строк. KOI8-R и CP1251 (также известный как Windows 1251) очень похожи.

Наблюдение 3

Стандартной библиотеке html/charset можно доверить только определение UTF-8. Если пользоваться charset. DeterminesEncoding(), то метод utf8. Valid (b []byte) возвращает folder.

Набор символов

Эквивалентная кодовая точка Unicode каждого символа отображается на экране. Первая половина таблицы, в которой находится кодовая страница 437, скрыта, оставляя видимой только вторую половину (кодовые точки 128-255).

В отличие от альтернативной кодовой страницы, обозначение Другое Неопределено

Обновления знака евро

Кодовая страница IBM / CCSID 808 является вариантом кодовой страницы – CCSId807 – с обозначением евро (в шестнадцатеричной позиции F), в которой U 20AC находится под знаком универсальной валюты.

Знак евро представлен шестнадцатеричным кодом Fd в кодовой странице IBM/CCSID 848, которая является вариацией кодовой страницы/CCSID 1125.

Кодовая страница IBM / CCSID 849 – это вариант кодовой страницы / CCSID 1131 со знаком евро в шестнадцатеричном коде FB , заменяющим ¤.

Особенности, с которыми я столкнулся

Я затрону все тонкости и проблемы, связанные с golang. Для начинающих нет необходимости писать на golang.ru

Первый критерий

Первый критерий – количество наиболее распространенных букв русского алфавита.

E, a и n, t, s. В алфавитном порядке буквы следующие: o, i, c, p, k, m, p. Я использовал только первые 9 букв из кодировок KOI8-r и CP1251. Этого вполне достаточно для уверенной идентификации

Для KOI8-r и CP1251 мне пришлось доработать его напильником. CP1251 имеет код 0xEe, а KOI8-r имеет этот код для буквы n. Для CP1251 используются a, i, n. cp; в l, k i. Для KOI8-r – o (a) или – t, c, p, c,l, m).

Перекодировка текста (сборник кодов для различных кодовых страниц)

Примеры универсальных (насколько это возможно для пакетного файла) перекодировщиков от ComSpec.

Этот транскодер был построен более логично, чем предыдущие, которые полагались на циклы для разбора текста строка за строкой.

for

“. Этот код абсолютно устойчив к специальным символам, встречающимся в тексте, и полностью сохраняет форматирование текста” Код проверяется на всех символах английской и русской раскладки клавиатуры. Максимальная длина обрабатываемых строк может достигать 4091 символа.

Прелести

Возможно, неустанные удары компиляторов и линтеров по рукам, или активное использование диапазона.

Конечно, приятно жить со сборщиком мусора. Надеюсь, мне еще предстоит овладеть граблями автоматизации выделения/освобождения памяти, и все же дебильная улыбка не сходит с моего лица.

Переменные функции являются простыми реализациями различных действий в объектах одного типа.

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

Предоставляется полный набор инструментов, и это дает вам прекрасное ощущение того, как компилятор и язык взаимодействуют в ваших интересах.

Спасибо falconandy за назидательные слова мудрости.

  1. Перевел тесты для проверки, и они действительно стали более читабельными
  2. Исправил пути к файлам данных в тестах для совместимости с Linux
  3. Прошелся по линтеру – нашел реальную ошибку (проклятый copy/pass).
:/>  Непонятные символы вместо текста в браузере

По мере добавления новых тестов, UTF16 не определяется. Обновлено. Даже если нет русских букв, UTF16 и LE все равно определяются.

Проблемы

Я лично прошел через некоторые подводные камни 50 Shades of Go: подводные камни, а также распространенные ошибки новичков. Я проверил переменную типа io. Reader с помощью рефлексии

//CodePageDetect - detect code page of ascii data from reader 'r'
func CodePageDetect(r io.Reader, stopStr ...string) (IDCodePage, error) {
    if !reflect.ValueOf(r).IsValid() {
        return ASCII, fmt.Errorf("input reader is nil")
    }
...

Однако, как выяснилось, достаточно проверить на ноль. Сейчас все стало проще.

func CodePageDetect(r io.Reader, stopStr ...string) (IDCodePage, error) {
    //test input interfase
    if r == nil {
        return ASCII, nil
    }
    //make slice of byte from input reader
    buf, err := bufio.NewReader(r).Peek(ReadBufSize)
    if (err != nil) && (err != io.EOF) {
        return ASCII, err
    }
...

Bufio. NewReader(r) успешно выполняет следующий тест:

    var data *os.File
    res, err := CodePageDetect(data)

Peek() возвращает ошибку.

У меня возникли небольшие проблемы с передачей массивов по значению. Я немного запутался, пытаясь изменить элементы, хранящиеся в map.

Собственный велосипед

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

Для меня это не было целью. Я могу вычислять коды, если есть русский язык. И третье, определять нужно по небольшому количеству символов – на 10 или даже 5 символах должно быть достаточно уверенное определение.

Сравнение найденных решений на автоопределение кодировки

Softlandiacpd подготовила тестовые файлы с различными кодировками. Содержимое файлов очень короткое и одинаковое. Одна строка в кодировке CodePageName. Другой файл со смесью кодировок и некоторыми сложными случаями.

Я думаю, это было весело.

Таблица koi8-r

В обеих кодировках алфавит расположен от 0xC0 до 00F. Но там, где у одной написаны заглавные буквы и строчные в другом месте: Похоже, enca работает по строчным буквам. Вот и получается, если послать программе enca строку «СТП» в кодировке CP1251 с пометкой “Яро” (в KOI8-r) — она решит что это яра. В обратную сторону работает.

Украинский и белорусский варианты

I BM называет украинский стандарт RST 2022-91 RUSCII или кодовой страницей 1125 (CCPSID). За исключением hex до f9 включительно, это соответствует оригинальному коду альтернативной страницы для всех точек F2.

Для всех точек F8, за исключением hex, f9 hex и “FC” hex до FE hex включительно, кодовая страница/CCSID 1131 соответствует кодовой странице 866. Различные строки показаны ниже.

Альтернативная кодовая страница отличается от кодовой страницы 1125.

  Кодовая страница 1131 отличается от кодовой страницы 866

Оставьте комментарий

Adblock
detector