Как использовать другие слои unicode

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как использовать другие слои unicode

Сообщение kuksha » 31.03.2010 08:12:57

Понадобились мне знаки не из базового слоя unicode U-XXXX, а из дополнительного: U-1XXXX.
Поскольку я ввожу знаки при помощи кодов, то способ
Код: Выделить всё
Form1.Knopka.Caption:=UTF8Encode(#$10140);

естественно не сработал: Illegal char constant

Как справиться?
kuksha
новенький
 
Сообщения: 28
Зарегистрирован: 10.01.2010 20:04:51

Re: Как использовать другие слои unicode

Сообщение скалогрыз » 31.03.2010 09:03:26

kuksha писал(а):Понадобились мне знаки не из базового слоя unicode U-XXXX, а из дополнительного: U-1XXXX.

интересно зачем?! :)
kuksha писал(а):
Код: Выделить всё
Form1.Knopka.Caption:=UTF8Encode(#$10140);

естественно не сработал: Illegal char constant
Как справиться?


чтением литературы
UTF-16 (англ. Unicode Transformation Format) в информатике — один из способов кодирования символов из Unicode в виде последовательности 16-битных слов. Символы с кодами меньше 0x10000 (216) представляются как есть, а символы с кодами 0x10000—0x10FFFF — в виде последовательности двух 16-битных слов, первое из которых лежит в диапазоне 0xD800–0xDBFF, а второе — 0xDC00—0xDFFF.


т.е. $10140 кодируется так:
Код: Выделить всё

UTF8Encode(#$D800#$DD40);

вопрос в другом... поддерживает ли сама система суррогатные символы. Есть ли поддержка для них в шрифтах системы.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как использовать другие слои unicode

Сообщение kuksha » 31.03.2010 13:21:47

скалогрыз писал(а):
kuksha писал(а):Понадобились мне знаки не из базового слоя unicode U-XXXX, а из дополнительного: U-1XXXX.
интересно зачем?! :)

Переводчик чисел разных народов и культур делаю.
http://krina.land.ru/Titlo/Titlo.dhtml
Вот решил на лазарус всё это перетащить. Как оказалось, греческие аттические цифры именно в первой плоскости юникода...

Насчёт "поддерживает ли сама система суррогатные символы" - в смысле операционка или лазарус?
"Есть ли поддержка для них в шрифтах системы" - в готовых шрифтах этих знаков нет, но не только их, к сожалению... приходится свой шрифт делать. А что будет с отображением знаков из других плокостей юникода даже при наличии их в шрифте - даже любопыто :)

Насчёт UTF16 догадывался, но вот как именно это сделать сам не додумался... Спасибо!
kuksha
новенький
 
Сообщения: 28
Зарегистрирован: 10.01.2010 20:04:51

Re: Как использовать другие слои unicode

Сообщение скалогрыз » 31.03.2010 15:09:26

kuksha писал(а):Переводчик чисел разных народов и культур делаю.
http://krina.land.ru/Titlo/Titlo.dhtml
Вот решил на лазарус всё это перетащить. Как оказалось, греческие аттические цифры именно в первой плоскости юникода...

полезное дело. Как портируешь, смело впиши её сюда: http://wiki.freepascal.org/Lazarus_Application_Gallery

kuksha писал(а):Насчёт "поддерживает ли сама система суррогатные символы" - в смысле операционка или лазарус?

например ОСь, может заменять суррогатные символы, в тексте кнопки, на какую-нибудь другую фигню.

kuksha писал(а):"Есть ли поддержка для них в шрифтах системы" - в готовых шрифтах этих знаков нет, но не только их, к сожалению... приходится свой шрифт делать. А что будет с отображением знаков из других плокостей юникода даже при наличии их в шрифте - даже любопыто :)

скорее всего такие шрифты уже есть... но не факт, что бесплатные, но можно поискать.

kuksha писал(а):Насчёт UTF16 догадывался, но вот как именно это сделать сам не додумался... Спасибо!


вот тебе функции в помощь. Code передаёшь U-код суррогата (код символа первого слоя), на выходе, получаешь строку нужного вида ;)
Код: Выделить всё
function SurPair(code: LongWord): WideString;
var
  w : Word;
begin
  w:=word(code and $FFFF);
  SetLength(Result, 2);
  Result[1]:=WideChar($d800 or ((w shr 10) and $2FF));
  Result[2]:=WideChar($dc00 or (w and $2ff));
end;

function SurPairUtf8(code: LongWord): WideString;
begin
  Result:=UTF8Encode(SurPair(code));
end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как использовать другие слои unicode

Сообщение Odyssey » 31.03.2010 15:55:21

скалогрыз писал(а):
Код: Выделить всё
function SurPairUtf8(code: LongWord): WideString;

хмм, может быть так:
Код: Выделить всё
function SurPairUtf8(code: LongWord): string;

?
Не в упрёк, но ради справедливости :)
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Как использовать другие слои unicode

Сообщение kuksha » 31.03.2010 16:00:27

О, функции как раз те, что надо. Благодарствую ещё раз.
Со шрифтами на самом деле очень плохо. Я уже при работе с базовой областью столкнулся - пришлось глифы самому рисовать... Даже наиболее полные Arial Unicose MS и Code2000 остановились на четвёртой версии юникода, если не раньше.
kuksha
новенький
 
Сообщения: 28
Зарегистрирован: 10.01.2010 20:04:51

Re: Как использовать другие слои unicode

Сообщение скалогрыз » 31.03.2010 16:48:50

Odyssey писал(а):
скалогрыз писал(а):хмм, может быть так:
Код: Выделить всё
function SurPairUtf8(code: LongWord): string;

?
Не в упрёк, но ради справедливости :)

Воистину SurPairUtf8 не может WideString возвращать!

и, наверное, лучше даже так:
Код: Выделить всё
function SurPairUtf8(code: LongWord): AnsiString;

а то мало ли... фанаты shortstring-ов...
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как использовать другие слои unicode

Сообщение kuksha » 31.03.2010 22:07:19

Наконец добрался до домашнего компа... Windows XP SP3, Lazarus 0.9.28.2. beta
Для начала переделал фонт, добавил знак 10140, вошёл в ворд, выбрал переделанный фонт и проверил Alt+65856 - напечаталось правильно.
Зашёл в лазарус и для начала просто напечатал
UTF8Encode(#$D800#$DD40)
Вместо ожидаемого знака - знаки вопроса
Ну функции пробовать уже не стал...

Зашёл в Дельфи 7 и ввёл ту же комбинацию - в ответ пустота (кнопка из компоненты TNTUnicode)

Вот такие пироги...
kuksha
новенький
 
Сообщения: 28
Зарегистрирован: 10.01.2010 20:04:51

Re: Как использовать другие слои unicode

Сообщение Sergei I. Gorelkin » 31.03.2010 22:34:48

Советчики, елы-палы...
Вот эта строка в функции SurPair w:=word(code and $FFFF); зачем? Мы кодируем 20 бит, а не 16.
Маска в двух следующих строках с какого перепуга получилась $2FF? 10 младших бит - это $3FF.

UTF-16 представление кода $10140 - будет #$D840#$DD40.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Как использовать другие слои unicode

Сообщение скалогрыз » 31.03.2010 23:47:25

Sergei I. Gorelkin писал(а):Советчики, елы-палы...
Вот эта строка в функции SurPair w:=word(code and $FFFF); зачем? Мы кодируем 20 бит, а не 16.
Маска в двух следующих строках с какого перепуга получилась $2FF? 10 младших бит - это $3FF.

точно! всё так! :D

Код: Выделить всё
function SurPair(code: LongWord): WideString;
begin
  SetLength(Result, 2);
  Result[1]:=WideChar($d800 or ((code shr 10) and $3FF));
  Result[2]:=WideChar($dc00 or (code and $3ff));
end;


Sergei I. Gorelkin писал(а):UTF-16 представление кода $10140 - будет #$D840#$DD40.

почему D840?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как использовать другие слои unicode

Сообщение Sergei I. Gorelkin » 01.04.2010 00:09:45

$10140 shr 10 = $40
$40 or $D800 = $D840
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Как использовать другие слои unicode

Сообщение скалогрыз » 01.04.2010 00:17:31

действительно! в нулях общитался!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как использовать другие слои unicode

Сообщение kuksha » 01.04.2010 21:22:25

Не выходит каменный цветок... :(
#$D840#$DD40 - тоже не срабатывает. Я уже и unocode чарсет поставил для контрола и шрифт принудительно назначил...
Через функции тоже пробовал:
Код: Выделить всё
function SurPair(code: LongWord): WideString;
begin
  SetLength(Result, 2);
  Result[1]:=WideChar($d800 or ((code shr 10) and $3FF));
  Result[2]:=WideChar($dc00 or (code and $3ff));
end;
function SurPairUtf8(code: LongWord): AnsiString;
begin
  Result:=UTF8Encode(SurPair(code));
end;   

Кстати, печатаются ДВА знака вопроса... такое ощущение, что печатаются именно два символа вместо одного?
kuksha
новенький
 
Сообщения: 28
Зарегистрирован: 10.01.2010 20:04:51

Re: Как использовать другие слои unicode

Сообщение скалогрыз » 01.04.2010 23:22:03

странно. Может в системе не включена расширенная поддержка шрифтов?

у меня всё работает. Суррогатная пара воспринимается, как 1 символ (а не 2 неизвестных)

причём вывод делаю, как с помощью Canvas, так и с помощью стандартных контролов.

(в тесте в качестве кода, можно вводить не только суррогатные символы, но и hex код любого unicode символа)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как использовать другие слои unicode

Сообщение kuksha » 02.04.2010 21:20:12

скалогрыз, извини, у меня тут с лазарусом неприятности случились, точнее с виндой наверное - не могу вообще ничего скомпилировать, в том числе твой пример...
Пока разгребаюсь, можешь выслать скомпилированный экзешник?
kuksha
новенький
 
Сообщения: 28
Зарегистрирован: 10.01.2010 20:04:51

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru