Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Jan 28, 2020 3:00 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 28 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Fri Oct 26, 2012 11:04 am 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Мне нужны процедуры для преобразования Колибри дата/время в Unix формат и обратно.
Еще нужны процедуры для преобразования CP866 в Unicode (лучше UTF-8) и обратно.
Если кто писал, укажите на код - поиск по форуме ничего не дал.


Top
   
PostPosted: Fri Oct 26, 2012 1:15 pm 
johnfound wrote:
Еще нужны процедуры для преобразования CP866 в Unicode (лучше UTF-8) и обратно.

В коде Tinypad есть вроде, еще в ядре есть, в коде работы с файловыми системами.


Top
   
PostPosted: Fri Oct 26, 2012 1:20 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Спасибо, смотрю.


Top
   
PostPosted: Fri Oct 26, 2012 1:31 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5078
Unicode в CP866 и другие есть в HTMLv


Attachments:
encoding.h [4.02 KiB]
Downloaded 126 times

_________________
Через тернии к звездам
Top
   
PostPosted: Fri Oct 26, 2012 3:10 pm 
Offline

Joined: Tue Oct 05, 2010 6:05 pm
Posts: 216
Упрощенный CP866 в Unicode из truetype.obj
Code:
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;
}


Top
   
PostPosted: Fri Oct 26, 2012 3:46 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Я решил сделать unicode<->ansi процедуры на табличной основе. Это позволит сделать преобразования универсальными. Недостаток в том что unicode->ansi получается несколько медленно, потому что надо делать поиск в таблице на каждом символе. Но думаю скорость здесь на так важна.


Top
   
PostPosted: Fri Oct 26, 2012 3:50 pm 
Spoiler: Show
Offtopic: И этот человек сокрушался по поводу памяти и "медленной" работы с функцией 9...


Top
   
PostPosted: Fri Oct 26, 2012 4:18 pm 
Offline
User avatar

Joined: Tue May 08, 2007 12:44 am
Posts: 346
johnfound wrote:
Недостаток в том что unicode->ansi получается несколько медленно, потому что надо делать поиск в таблице на каждом символе.

Даже не знаю, стоит ли вставить свои пять копеек, потому как пишу под Windows, но проблема та же (понадобилась собственная процедура трансляции, потому что системная гадит диакритики).
Spoiler: Show
У себя в CoreLib я решил строить таблицу обратного преобразования в памяти, беря минимальный и максимальный символы Unicode. См. TSingleByteCodePage.


Табличный способ трансляции -- самый правильный.

_________________
Разработчик языка программирования Кантор


Top
   
PostPosted: Fri Oct 26, 2012 10:27 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Если использовать двоичный поиск в сортированную таблицу, скорость unicode->ansi получается вполне хорошей (макс. 8 итерации на символ). Плохо только что таблицы на двух направлениях получаются 640 байт... (256 байт на ansi->unicode и 384 байт на unicode->ansi)
Но я думаю что компромисс приемлемый...

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

В архиве есть компилированные версии для Windows и Linux.
[edit]Файл обновлен - теперь есть и версия для KolibriOS.[/edit]


Attachments:
TextEncodings.zip [17.78 KiB]
Downloaded 119 times


Last edited by johnfound on Sat Oct 27, 2012 4:18 pm, edited 1 time in total.
Top
   
PostPosted: Sat Oct 27, 2012 4:16 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
Кстати, сделал в FreshLib, чтобы программа устанавливала текущую директорию там где находится исполнимый файл.
И возникает вопрос - а не лучше ли это сделать в ядре?


Top
   
PostPosted: Sat Oct 27, 2012 4:37 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
johnfound
Обычно текущая директория наследуется от родительского процесса.


Top
   
PostPosted: Sat Oct 27, 2012 4:52 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
А почему, когда запускаю программу из shell или eolite, текущая директория все равно на "/rd/1" хотя и исполнил команду "cd"?


Top
   
PostPosted: Sat Oct 27, 2012 6:42 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Потому что shell и eolite забывают поменять рабочий каталог ?


Top
   
PostPosted: Sat Oct 27, 2012 8:13 pm 
Offline
User avatar

Joined: Tue May 08, 2007 12:44 am
Posts: 346
johnfound wrote:
Плохо только что таблицы на двух направлениях получаются 640 байт... (256 байт на ansi->unicode и 384 байт на unicode->ansi)

Ну, это по-любому меньше, чем, например, если делать прямую таблицу от наименьшего к наибольшему символу, забитую нулями при отсутствии подстановки. Для Windows-1251 такая таблица займет порядка 8 КБ, из которых значащих будет всего 256 байт, остальное -- нули. Для программы под Windows я посчитал такой расход приемлемым, а в "Колибри" традиции отличаются. :)

Зато таблица обратной трансляции строится в памяти на основе исходной, занимающей всего 256 байт, которые и хранятся на диске (в моём случае -- берутся из Windows).

_________________
Разработчик языка программирования Кантор


Top
   
PostPosted: Sat Oct 27, 2012 8:29 pm 
Offline

Joined: Fri Feb 18, 2011 3:13 pm
Posts: 201
А таблица обратной трансляции можно и вообще 128 байт сделать. Уникоды внутри не нужны, потому что их уже есть в таблице трансляции ansi->unicode. В итоге 384 байт и никакие вычисления на лету.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 28 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited