MiniM Overview |
MiniM
Knowledge Base | Dec 13, 2013 Linux console and UTF-8 При работе консоли в Linux возникают проблемы кодирования символов и пересчета позиционирования при использовании нелатинских символов.Проблема некорретного рассчета позиционирования каретки в консоли Linux вызвана использованием консоли с кодированием UTF-8. MiniM Database Server не поддерживает юникод, и все данные рассматривает как 8-битные строки. Одному символу сопоставляется один 8-ми битный байт. Порядок сопоставления символа одному байту, или способ кодирования, задается только для латинской части байт в кодировании ANSI, коды меньше чем 128. Все коды старше чем 128 рассматриваются, в соответствии со стандартом языка MUMPS, как графические. Соответствие кодов символов отображаемым изображениям выполняется клиентским программным обеспечением при отображении в сочетании с применяемыми им шрифтами. MiniM Database Server применяет таблицы определения символов (.nat файлы). В этих файлах задается порядок сравнения байт и порядок поднимания и опускания регистра символов. Определение того, является символ буквой национального алфавита или нет, определяется правилом: если результат перевода символа в верхний регистр отличается от результата перевода в нижний регистр, то это буква. Это правило используется в регулярных выражениях и шаблонах MUMPS. Одновременно с тем в таблицах определения символов MiniM Database Server не задается, как именно кодируется какой символ национального алфавита, и отсутствует правило сопоставления кода символа коду в юникоде. Все программное обеспечение консольных утилит MiniM Database Server независимо от редакции использует входные и выходные потоки в кодировании 8-битных байт. В случае если клиентская сторона присылает последовательности в иных кодированиях (различные варианты UTF), то это приводит к ошибкам распознавания какой байт чему соответствует. В частности, если консоль Linux работает в режиме UTF-8, при вводе национального символа консоль присылает не один байт, а два или более. При этом на экране отображается одно знакоместо. Сторона MiniM, приняв не один а два или более байт, располагает их во внутренней памяти, считая что пришло соответственно два или более символов и выполняет внутренний пересчет ожидаемого положения каретки ввода. При редактировании строки сторона MiniM может отсылать соответственно клиентской стороне (терминал Linux) внутренние байты, в действительности не являющиеся кодами символов, не зная о значении служебных байт в кодировании UTF. В целом проблема может быть решена двумя способами:
Первый способ в настоящее время не может быть выполнен из-за невозможности сопоставления кодов символов юникоду, так как это не поддерживается таблицами кодирования и внутренними алгоритмами MiniM Database Server. Второй способ может быть использован, если в настройках терминала произвести переключение используемого кодирования: Для корректного отображения данных, выводимых из базы данных на экран, необходимо применять кодировки, соответствующие использованным для хранения данных. Современные версии терминала Linux могут поддерживать самые разнообразные кодировки, как широко распространенные, так и настраиваемые. В случае если в терминале работала программа, установленная через репозитории, например MC, и использующая информацию о UTF версии, то при запуке из нее консоли MiniM необходимо переключить кодировку на 8-ми битную, а по завершении работы консоли переключить кодировку на UTF обратно. Евгений Каратаевsupport@minimdb.com
|
|
Info Support |