拉撒路。对于Unicode符号,等效于Chr()

时间:2011-08-05 20:28:38

标签: delphi unicode freepascal lazarus

freepascal中是否有任何函数通过其代码显示Unicode符号(例如U + 1D15E)?不幸的是,Chr()仅适用于ANSI符号(代码小于127)。
我想使用自定义符号字体中的符号,将它们直接放入源代码非常不方便(它们在Lazarus中显示为?或其他东西,因为它们在系统字体中不存在。)

4 个答案:

答案 0 :(得分:8)

看看this page。我假设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。

答案 1 :(得分:5)

我从未使用过Free Pascal,但如果我是你,我会尝试

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

或者,如果编译器真的很顽固,

var
  s: char;
begin
  PWord(@s)^ := $222b;                // Forcibly write a word

答案 2 :(得分:4)

我最了解FPC的当前unicode状态

  1. 可以使用$ codepage http://www.freepascal.org/docs-html/prog/progsu81.html
  2. 设置文字的代码页
  3. FPC 2.4.x +确实有unicodestring(因为它是+/- Kylix宽带)但只有基本的例程支持。 (pos和copy,不是格式化的例程),但是“record”错过了codepage字段。
  4. Lazarus小部件期望UTF8处于正常的ansistrings(D7..D2007 ansistrings没有代码页数据),并且程序员必须在必要时手动插入转换。所以在Windows上,小部件主要使用unicode(-W)调用,但是在其中使用带有UTF8的ansistrings。
  5. FPC不遵循ansistring方案中的utf8,因此对于sysutils中的一些字符串接受例程,Lazarus中有一些特殊例程假设UTF8调用-W变体)
  6. FPC ansistring是系统默认的1字节编码。在Windows上使用ansi,在大多数其他平台上使用utf8。
  7. Trunk,2.7.1,支持新的D2009 + ansistring(带代码页)。
  8. 目前还没有讨论如何处理默认的stringtype(例如,“string”是* nix上的utf8string和Windows上的unicodestring,还是unicodestring或utf8string?)
  9. 未实现其他与unicodestring相关的增强(如tstringlist.savetofile的编码参数)。同样对于伪对象(如TCharacter,它们主要是静态的)
  10. 更新:2.7.1有一个变量编码ansistring类型,lazarus已经修复以继续工作。然而,没有什么能真正利用它,例如大多数RTL仍然使用-A调用,并且sysutils的原型和采用字符串的系统过程尚未更改为rawbytestring。

答案 3 :(得分:3)

我认为问题是将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;