Код для преобразования данных.

Applications development, KoOS API questions
  • johnfound wrote:Еще нужны процедуры для преобразования CP866 в Unicode (лучше UTF-8) и обратно.
    В коде Tinypad есть вроде, еще в ядре есть, в коде работы с файловыми системами.
  • Спасибо, смотрю.
  • Unicode в CP866 и другие есть в HTMLv
    Attachments
    encoding.h (4.02 KiB)
    Downloaded 285 times
    Из хаоса в космос
  • Упрощенный CP866 в Unicode из truetype.obj

    Code: Select all

    int dos2utf (unsigned char some){
    	 int same;
    
    	   if (some>=0x80 && some <=0xAF) {same=(4<<8)+some-0x70;}
    	   else if (some>=0xE0 && some <=0xEF) {same=(4<<8)+some-0xA0;}
    	   else if (some==0xF0) {same=0x401;} //Ё
    	   else if (some==0xF1) {same=0x451;} //ё
    	   else {same=some;}
    	   	   return same;
    }
  • Я решил сделать unicode<->ansi процедуры на табличной основе. Это позволит сделать преобразования универсальными. Недостаток в том что unicode->ansi получается несколько медленно, потому что надо делать поиск в таблице на каждом символе. Но думаю скорость здесь на так важна.
  • Spoiler:: И этот человек сокрушался по поводу памяти и "медленной" работы с функцией 9...
  • johnfound wrote:Недостаток в том что unicode->ansi получается несколько медленно, потому что надо делать поиск в таблице на каждом символе.
    Даже не знаю, стоит ли вставить свои пять копеек, потому как пишу под Windows, но проблема та же (понадобилась собственная процедура трансляции, потому что системная гадит диакритики).
    Spoiler:У себя в CoreLib я решил строить таблицу обратного преобразования в памяти, беря минимальный и максимальный символы Unicode. См. TSingleByteCodePage.
    Табличный способ трансляции -- самый правильный.
  • Если использовать двоичный поиск в сортированную таблицу, скорость unicode->ansi получается вполне хорошей (макс. 8 итерации на символ). Плохо только что таблицы на двух направлениях получаются 640 байт... (256 байт на ansi->unicode и 384 байт на unicode->ansi)
    Но я думаю что компромисс приемлемый...

    Написал небольшую программу, которая создает эти таблицы от исходниках, опубликованных на unicode.org.

    В архиве есть компилированные версии для Windows и Linux.
    [edit]Файл обновлен - теперь есть и версия для KolibriOS.[/edit]
    Attachments
    TextEncodings.zip (17.78 KiB)
    Downloaded 264 times
    Last edited by johnfound on Sat Oct 27, 2012 4:18 pm, edited 1 time in total.
  • Кстати, сделал в FreshLib, чтобы программа устанавливала текущую директорию там где находится исполнимый файл.
    И возникает вопрос - а не лучше ли это сделать в ядре?
  • johnfound
    Обычно текущая директория наследуется от родительского процесса.
  • А почему, когда запускаю программу из shell или eolite, текущая директория все равно на "/rd/1" хотя и исполнил команду "cd"?
  • Потому что shell и eolite забывают поменять рабочий каталог ?
  • johnfound wrote:Плохо только что таблицы на двух направлениях получаются 640 байт... (256 байт на ansi->unicode и 384 байт на unicode->ansi)
    Ну, это по-любому меньше, чем, например, если делать прямую таблицу от наименьшего к наибольшему символу, забитую нулями при отсутствии подстановки. Для Windows-1251 такая таблица займет порядка 8 КБ, из которых значащих будет всего 256 байт, остальное -- нули. Для программы под Windows я посчитал такой расход приемлемым, а в "Колибри" традиции отличаются. :)

    Зато таблица обратной трансляции строится в памяти на основе исходной, занимающей всего 256 байт, которые и хранятся на диске (в моём случае -- берутся из Windows).
  • А таблица обратной трансляции можно и вообще 128 байт сделать. Уникоды внутри не нужны, потому что их уже есть в таблице трансляции ansi->unicode. В итоге 384 байт и никакие вычисления на лету.
  • Who is online

    Users browsing this forum: No registered users and 18 guests