Page 1 of 2
Код для преобразования данных.
Posted: Fri Oct 26, 2012 11:04 am
by johnfound
Мне нужны процедуры для преобразования Колибри дата/время в Unix формат и обратно.
Еще нужны процедуры для преобразования CP866 в Unicode (лучше UTF-8) и обратно.
Если кто писал, укажите на код - поиск по форуме ничего не дал.
Re: Код для преобразования данных.
Posted: Fri Oct 26, 2012 1:15 pm
by Mario
johnfound wrote:Еще нужны процедуры для преобразования CP866 в Unicode (лучше UTF-8) и обратно.
В коде Tinypad есть вроде, еще в ядре есть, в коде работы с файловыми системами.
Re: Код для преобразования данных.
Posted: Fri Oct 26, 2012 1:20 pm
by johnfound
Спасибо, смотрю.
Re: Код для преобразования данных.
Posted: Fri Oct 26, 2012 1:31 pm
by Leency
Unicode в CP866 и другие есть в HTMLv
Re: Код для преобразования данных.
Posted: Fri Oct 26, 2012 3:10 pm
by lev
Упрощенный 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;
}
Re: Код для преобразования данных.
Posted: Fri Oct 26, 2012 3:46 pm
by johnfound
Я решил сделать unicode<->ansi процедуры на табличной основе. Это позволит сделать преобразования универсальными. Недостаток в том что unicode->ansi получается несколько медленно, потому что надо делать поиск в таблице на каждом символе. Но думаю скорость здесь на так важна.
Re: Код для преобразования данных.
Posted: Fri Oct 26, 2012 3:50 pm
by Mario
Spoiler:
: И этот человек сокрушался по поводу памяти и "медленной" работы с функцией 9...
Re: Код для преобразования данных.
Posted: Fri Oct 26, 2012 4:18 pm
by Freeman
johnfound wrote:Недостаток в том что unicode->ansi получается несколько медленно, потому что надо делать поиск в таблице на каждом символе.
Даже не знаю, стоит ли вставить свои пять копеек, потому как пишу под Windows, но проблема та же (понадобилась собственная процедура трансляции, потому что системная гадит диакритики).
Spoiler:
У себя в CoreLib я решил строить таблицу обратного преобразования в памяти, беря минимальный и максимальный символы Unicode. См. TSingleByteCodePage.
Табличный способ трансляции -- самый правильный.
Re: Код для преобразования данных.
Posted: Fri Oct 26, 2012 10:27 pm
by johnfound
Если использовать двоичный поиск в сортированную таблицу, скорость unicode->ansi получается вполне хорошей (макс. 8 итерации на символ). Плохо только что таблицы на двух направлениях получаются 640 байт... (256 байт на ansi->unicode и 384 байт на unicode->ansi)
Но я думаю что компромисс приемлемый...
Написал небольшую программу, которая создает эти таблицы от исходниках, опубликованных на
unicode.org.
В архиве есть компилированные версии для Windows и Linux.
[edit]Файл обновлен - теперь есть и версия для KolibriOS.[/edit]
Re: Код для преобразования данных.
Posted: Sat Oct 27, 2012 4:16 pm
by johnfound
Кстати, сделал в FreshLib, чтобы программа устанавливала текущую директорию там где находится исполнимый файл.
И возникает вопрос - а не лучше ли это сделать в ядре?
Re: Код для преобразования данных.
Posted: Sat Oct 27, 2012 4:37 pm
by Serge
johnfound
Обычно текущая директория наследуется от родительского процесса.
Re: Код для преобразования данных.
Posted: Sat Oct 27, 2012 4:52 pm
by johnfound
А почему, когда запускаю программу из shell или eolite, текущая директория все равно на "/rd/1" хотя и исполнил команду "cd"?
Re: Код для преобразования данных.
Posted: Sat Oct 27, 2012 6:42 pm
by Serge
Потому что shell и eolite забывают поменять рабочий каталог ?
Re: Код для преобразования данных.
Posted: Sat Oct 27, 2012 8:13 pm
by Freeman
johnfound wrote:Плохо только что таблицы на двух направлениях получаются 640 байт... (256 байт на ansi->unicode и 384 байт на unicode->ansi)
Ну, это по-любому меньше, чем, например, если делать прямую таблицу от наименьшего к наибольшему символу, забитую нулями при отсутствии подстановки. Для Windows-1251 такая таблица займет порядка 8 КБ, из которых значащих будет всего 256 байт, остальное -- нули. Для программы под Windows я посчитал такой расход приемлемым, а в "Колибри" традиции отличаются.
Зато таблица обратной трансляции строится в памяти на основе исходной, занимающей всего 256 байт, которые и хранятся на диске (в моём случае -- берутся из Windows).
Re: Код для преобразования данных.
Posted: Sat Oct 27, 2012 8:29 pm
by johnfound
А таблица обратной трансляции можно и вообще 128 байт сделать. Уникоды внутри не нужны, потому что их уже есть в таблице трансляции ansi->unicode. В итоге 384 байт и никакие вычисления на лету.