8

考虑到这个由 3 个字母组成的阿拉伯语单词(جبل)。

-第一个字母是جـ,-名称是(ǧīm),-它的Unicode值是FE9F,当它开始时,-它的基本值是062C和-它的隔离值是FE9D,但最后两个值返回相同的形状绘图ج .

现在,每当我尝试将其作为单个字符(尝试多种不同的方式)时,Delphi 都会返回基本的 Unicode 值。好吧,这是有道理的,但是转换后的 char 会发生什么?它也是一个字符。看起来它只在字符串内时才采用转换后的值,但是在哪里呢?如何提取它?何时以及哪个过程决定这些值?再次主要问题: 我怎样才能得到阿拉伯字母或其Unicode值,因为它在一个字符串中?

仅供参考:与英语的字母(大写和小写)有两种情况不同,阿拉伯语有四种情况(孤立、开头、中间和结尾),它们的规则也不同。

4

3 回答 3

3

我不确定我是否理解这个问题。如果你想知道如何在 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 字符。

于 2013-05-15T08:08:27.593 回答
1

Uniscribe 服务 (USP10.dll) 提供用于在 Windows 中呈现的阿拉伯字符的形状。 UniScribe

您可能会发现以下博客文章很有用: Roozbeh 的编程博客

于 2013-05-15T22:22:43.353 回答
0

我不认为你可以使用字符串/字符相关的方法来做到这一点。但是使用 pchar,也许您可​​以访问内存并直接读取 Pword 值

编辑:在与大卫讨论之后,我认为你总是会得到这封信的基本/孤立的价值。使用开始或结束字形的事实可能只是由操作系统的显示框架处理

于 2013-05-15T10:36:08.227 回答