Есть ли в freepascal функция для отображения символа Unicode по его коду (например, U+1D15E)? К сожалению, Chr()
работает только с символами ANSI (с кодами меньше 127).
Я хочу использовать символы из собственного символьного шрифта, а вставлять их напрямую в исходный код очень неудобно (в Lazarus они отображаются как ?
или как-то иначе, потому что их нет в системных шрифтах).
Лазарь. Эквивалент Chr() для символов Unicode
Ответы (4)
Взгляните на эту страницу. Я предполагаю, что Freepascal либо использует UTF-16, в котором он становится суррогатной парой двух WideChars (см. таблицу), либо UTF-8, в котором он становится последовательностью байтовых значений (см. снова таблицу).
УТФ-8:
const
HalfNoteString = UTF8String(#$F0#$9D#$85#$9E);
УТФ-16:
const
HalfNoteString = UnicodeString(#$D834#$DD5E);
Названия строковых типов могут отличаться, так как я не очень хорошо знаю FreePascal. Возможно AnsiString и WideString.
Я никогда не использовал Free Pascal, но на вашем месте я бы попробовал
var
s: char;
begin
s := char($222b); // Just cast a word
или, если компилятор действительно упрям,
var
s: char;
begin
PWord(@s)^ := $222b; // Forcibly write a word
Насколько мне известно, текущий статус Unicode для FPC
- Кодовую страницу литералов можно установить с помощью $codepage http://www.freepascal.org/docs-html/prog/progsu81.html
- FPC 2.4.x+ имеет юникодную строку (поскольку это +/- широкая строка Kylix), но поддерживает только базовые подпрограммы. (pos и copy, а не такие подпрограммы, как формат), но в «записи» отсутствует поле кодовой страницы.
- Виджеты Lazarus ожидают UTF8 в обычных анзистрингах (анзисторы D7..D2007 без данных кодовой страницы), и программисты должны вручную вставлять преобразования, если это необходимо. Таким образом, в Windows виджеты в основном используют вызовы unicode (-W), но берут строки с кодировкой UTF8.
- FPC не следует за utf8 в схеме ansistring, поэтому для некоторых подпрограмм, принимающих строки в sysutils, в Lazarus есть специальные подпрограммы, которые предполагают UTF8, которые вызывают варианты -W)
- Ansistring FPC — это системная 1-байтовая кодировка по умолчанию. ansi в Windows, utf8 на большинстве других платформ.
- Trunk, 2.7.1, обеспечивает поддержку новой антистроки D2009+ (с кодовыми страницами).
- Пока не обсуждалось, как работать со строковым типом по умолчанию (например, будет ли «string» быть utf8string в *nix и unicodestring в Windows или везде unicodestring или utf8string?)
- Другие улучшения, связанные с unicodestring (например, параметры кодирования в tstringlist.savetofile), не реализованы. Аналогично для псевдообъектов (таких как TCharacter, которые на самом деле в основном статичны)
Обновление: 2.7.1 имеет переменную кодировку типа anstring, а lazarus был исправлен, чтобы продолжать работать. Однако на самом деле ничто не использует это, например. большая часть RTL по-прежнему использует вызовы -A, а прототипы sysutils и системных процедур, которые принимают строки, еще не изменились на rawbytestring.
Я предполагаю, что проблема заключается в преобразовании из кодировки UCS4 (которая на самом деле является кодовой точкой Unicode) в UTF16.
В Delphi вы можете использовать функцию UCS4StringToUnicodeString
.
Внимание! Будьте осторожны с типом UCS4String
. На самом деле это динамический массив с нулевым завершением, а не строка (это означает, что он отсчитывается от нуля).
var
S1: UCS4String;
S: string;
begin
SetLength(S1, 2);
S1[0]:= UCS4Char($1D15E);
S1[1]:= UCS4Char(0);
S:= UCS4StringToUnicodeString(S1);
ShowMessage(Format('%d, %x, %x', [Length(S), Ord(S[1]), Ord(S[2])]));
end;
U+1D15E
— слегка патологический пример, поскольку1D15E
— это не слово (на одну шестнадцатеричную цифру слишком много). - person Andreas Rejbrand   schedule 06.08.2011