Поскольку я ввожу знаки при помощи кодов, то способ
- Код: Выделить всё
Form1.Knopka.Caption:=UTF8Encode(#$10140);
естественно не сработал: Illegal char constant
Как справиться?
Модератор: Модераторы
Form1.Knopka.Caption:=UTF8Encode(#$10140);
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.
UTF8Encode(#$D800#$DD40);
скалогрыз писал(а):
kuksha писал(а):Понадобились мне знаки не из базового слоя unicode U-XXXX, а из дополнительного: U-1XXXX.
интересно зачем?!
kuksha писал(а):Переводчик чисел разных народов и культур делаю.
http://krina.land.ru/Titlo/Titlo.dhtml
Вот решил на лазарус всё это перетащить. Как оказалось, греческие аттические цифры именно в первой плоскости юникода...
kuksha писал(а):Насчёт "поддерживает ли сама система суррогатные символы" - в смысле операционка или лазарус?
kuksha писал(а):"Есть ли поддержка для них в шрифтах системы" - в готовых шрифтах этих знаков нет, но не только их, к сожалению... приходится свой шрифт делать. А что будет с отображением знаков из других плокостей юникода даже при наличии их в шрифте - даже любопыто
kuksha писал(а):Насчёт UTF16 догадывался, но вот как именно это сделать сам не додумался... Спасибо!
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;
скалогрыз писал(а):
- Код: Выделить всё
function SurPairUtf8(code: LongWord): WideString;
function SurPairUtf8(code: LongWord): string;
Odyssey писал(а):скалогрыз писал(а):хмм, может быть так:
- Код: Выделить всё
function SurPairUtf8(code: LongWord): string;
?
Не в упрёк, но ради справедливости
function SurPairUtf8(code: LongWord): AnsiString;
Sergei I. Gorelkin писал(а):Советчики, елы-палы...
Вот эта строка в функции SurPair w:=word(code and $FFFF); зачем? Мы кодируем 20 бит, а не 16.
Маска в двух следующих строках с какого перепуга получилась $2FF? 10 младших бит - это $3FF.
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.
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;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47