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