我不确定我是否理解这个问题。如果你想知道如何在 Delphi 源代码中编写U+FE9F,在现代 Unicode 版本的 Delphi 中。这样做就像这样:
Char($FE9F)
如果您想从 جبل 读取单个字符,请执行以下操作:
const
MyWord = 'جبل';
var
c: Char;
....
c := MyWord[1];//this is U+062C
请注意,上面的代码适用于您的特定单词,因为每个代码点都可以使用单个 UTF-16WideChar
字符元素进行编码。如果代码点需要多个元素,那么最好转换为 UTF-32 以进行代码点级别的处理。
现在,让我们看看您在问题中包含的字符串。我使用 wget 下载了这个问题,并且通过电线传输的文件是 UTF-8 编码的。我使用 Notepad++ 转换为 UTF16-LE,然后挑选出字符串的三个 UTF-16 字符。他们是:
U+062C
U+0628
U+0644
你说:
第一个字母是جـ,名字是(ǧīm),它的Unicode值是U+FE9F。
但这根本不正确。从上面可以看出,你发的实际字符是U+062C。因此,您尝试读取第一个字符产生 U+062C 的原因是 U+062C 确实是字符串的第一个字符。
最重要的是,您的 Delphi 代码中没有任何内容可以改变您的角色。当你这样做时:
S[1] := Char($FE9F);
编译器执行简单的两字节复制。不会发生上下文感知转换。阅读时也是如此S[1]
。
让我们看看这些字符是如何显示的,在一个包含备忘录控件的 VCL 表单应用程序上使用这个简单的代码:
Memo1.Clear;
Memo1.Lines.Add(StringOfChar(Char($FE9F), 2));
Memo1.Lines.Add(StringOfChar(Char($062C), 2));
输出如下所示:
如您所见,渲染层知道如何处理出现在字符串开头的 U+062C 字符。