Lazarus.Эквивалент Chr () для символов Юникода - PullRequest
3 голосов
/ 06 августа 2011

Есть ли в freepascal какая-либо функция для отображения символа Unicode по его коду (например, U + 1D15E)?К сожалению, Chr() работает только с символами ANSI (с кодами меньше 127).
Я хочу использовать символы из собственного символического шрифта, и очень неудобно напрямую помещать их в исходный код (они отображаются в Lazarus как ? или как-то еще, потому что они отсутствуют в системных шрифтах).

Ответы [ 4 ]

8 голосов
/ 06 августа 2011

Взгляните на эту страницу .Я предполагаю, что Freepascal использует UTF-16, в котором он становится суррогатной парой двух WideChars (см. Таблицу), или UTF-8, в котором он становится последовательностью байтовых значений (см. Таблицу снова).

UTF-8:

const
  HalfNoteString = UTF8String(#$F0#$9D#$85#$9E);

UTF-16:

const
  HalfNoteString = UnicodeString(#$D834#$DD5E);

Имена типов строк могут отличаться, поскольку я не очень хорошо знаю FreePascal.Возможно AnsiString и WideString.

5 голосов
/ 06 августа 2011

Я никогда не использовал Free Pascal, но на вашем месте я бы попробовал

var
  s: char;
begin
  s := char($222b);                   // Just cast a word

или, если компилятор действительно упрямый,

var
  s: char;
begin
  PWord(@s)^ := $222b;                // Forcibly write a word
4 голосов
/ 08 августа 2011

Насколько мне известно, текущий статус Unicode FPC

  1. Кодовая страница литералов может быть установлена ​​с помощью $ codepage http://www.freepascal.org/docs-html/prog/progsu81.html
  2. FPC 2.4.x + действительно имеет уникальную строку (так как+/- Kylix widestring), но только базовая рутинная поддержка.(pos и copy, а не подпрограммы, подобные формату), но «запись» пропускает поле кодовой страницы.
  3. Виджеты Lazarus ожидают UTF8 в нормальных ответных строках (ответные строки D7..D2007 без данных кодовой страницы), и программисты должны вручную вставитьпреобразования при необходимости.Таким образом, в Windows виджеты в основном используют вызовы Unicode (-W), но принимают анистроки с UTF8.
  4. FPC не следует utf8 в схеме ansistring, поэтому для некоторых подпрограмм, принимающих строки в sysutils, естьэто специальные подпрограммы в Lazarus, которые предполагают, что UTF8 вызывают варианты -W)
  5. Ответная строка FPC является однобайтовой кодировкой системы по умолчанию.ansi в Windows, utf8 на большинстве других платформ.
  6. Trunk, 2.7.1, обеспечивает поддержку новой рассылки D2009 + (с кодовыми страницами).
  7. Пока не обсуждалось, как обращаться с типом строки по умолчанию (например, будет ли "строка" utf8string в * nix и unicodestring в Windows, или unicodestring или utf8string везде?)
  8. Другие unicodestringсвязанные улучшения (например, параметры кодирования в tstringlist.savetofile) не реализованы.Аналогично для псевдообъектов (например, TCharacter, которые в основном статичны)

Обновление: 2.7.1 имеет переменную кодировку типа ansistring, и lazarus исправлен, чтобы продолжать работать.Однако пока ничто в действительности не использует его, например, большинство RTL по-прежнему использует вызовы -A, а прототипы sysutils и системных процедур, которые принимают строки, еще не изменились на rawbytestring.

3 голосов
/ 06 августа 2011

Я предполагаю, что проблема заключается в преобразовании из кодировки 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;
...