Мне нужны процедуры для преобразования Колибри дата/время в Unix формат и обратно.
Еще нужны процедуры для преобразования CP866 в Unicode (лучше UTF-8) и обратно.
Если кто писал, укажите на код - поиск по форуме ничего не дал.
Код для преобразования данных.
В коде Tinypad есть вроде, еще в ядре есть, в коде работы с файловыми системами.johnfound wrote:Еще нужны процедуры для преобразования CP866 в Unicode (лучше UTF-8) и обратно.
Спасибо, смотрю.
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...Даже не знаю, стоит ли вставить свои пять копеек, потому как пишу под Windows, но проблема та же (понадобилась собственная процедура трансляции, потому что системная гадит диакритики).johnfound wrote:Недостаток в том что unicode->ansi получается несколько медленно, потому что надо делать поиск в таблице на каждом символе.
Spoiler:
У себя в CoreLib я решил строить таблицу обратного преобразования в памяти, беря минимальный и максимальный символы Unicode. См. TSingleByteCodePage.Если использовать двоичный поиск в сортированную таблицу, скорость unicode->ansi получается вполне хорошей (макс. 8 итерации на символ). Плохо только что таблицы на двух направлениях получаются 640 байт... (256 байт на ansi->unicode и 384 байт на unicode->ansi)
Но я думаю что компромисс приемлемый...
Написал небольшую программу, которая создает эти таблицы от исходниках, опубликованных на unicode.org.
В архиве есть компилированные версии для Windows и Linux.
[edit]Файл обновлен - теперь есть и версия для KolibriOS.[/edit]
Но я думаю что компромисс приемлемый...
Написал небольшую программу, которая создает эти таблицы от исходниках, опубликованных на 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 забывают поменять рабочий каталог ?
Ну, это по-любому меньше, чем, например, если делать прямую таблицу от наименьшего к наибольшему символу, забитую нулями при отсутствии подстановки. Для Windows-1251 такая таблица займет порядка 8 КБ, из которых значащих будет всего 256 байт, остальное -- нули. Для программы под Windows я посчитал такой расход приемлемым, а в "Колибри" традиции отличаются.johnfound wrote:Плохо только что таблицы на двух направлениях получаются 640 байт... (256 байт на ansi->unicode и 384 байт на unicode->ansi)
Зато таблица обратной трансляции строится в памяти на основе исходной, занимающей всего 256 байт, которые и хранятся на диске (в моём случае -- берутся из Windows).
А таблица обратной трансляции можно и вообще 128 байт сделать. Уникоды внутри не нужны, потому что их уже есть в таблице трансляции ansi->unicode. В итоге 384 байт и никакие вычисления на лету.
Who is online
Users browsing this forum: No registered users and 18 guests