– 第一个字母是ج,
-name是(ǧīm),
– 当它在开始时,Unicode值是FE9F,
– 基本值是062C和
-its isolated值为FE9D,但最后两个值返回相同的形状绘制ج.
现在,每当我尝试将它作为单个字符 – 以多种不同的方式 – 时,Delphi返回基本的Unicode值.
好吧,这是有道理的,但是转化后的char会发生什么?它也是一个单独的字符..看起来它只在字符串中使用转换后的值,但在哪里?如何提取它?什么时候和哪个过程决定这些值?
主要问题:
如何获取字母表中的阿拉伯字母或其Unicode值?
仅供参考:与其英文字母(大写和小字母)有两种情况不同,阿拉伯语有四种情况(隔离,开始,中间和结束),也有不同的规则.
解决方法
Char($FE9F)
如果你想从جبل中读取单个字符,那么就这样做:
const MyWord = 'جبل'; var c: Char; .... c := MyWord[1];//this is U+062C
请注意,上面的代码适用于您的特定单词,因为每个代码点都可以使用单个UTF-16 WideChar字符元素进行编码.如果代码点需要多个元素,那么最好转换为UTF-32进行代码点级处理.
现在,让我们看看你在问题中包含的字符串.我使用wget下载了这个问题,导线下的文件是UTF-8编码的.我使用记事本转换为UTF16-LE,然后挑出字符串的三个UTF-16字符.他们是:
U+062C U+0628 U+0644
你说:
The first letter is جـ,name is (ǧīm),its Unicode value is U+FE9F.
但这完全是错误的.从上面可以看出,你发布的实际角色是U 062C.因此,您尝试读取第一个字符U062C的原因是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字符.