Delphi 获取字符串中的中间/开头/结尾阿拉伯字符

Delphi 获取字符串中的中间/开头/结尾阿拉伯字符,delphi,unicode,firemonkey,Delphi,Unicode,Firemonkey,大多数阿拉伯字母都有多种上下文形式,例如后者具有通用unicode0628 但如果后者出现在单词的开头,将采用这种形式‎unicodeFE91 中间=‎unicodeFE92 词尾=‎‎unicodeFE90 我试图得到字符代码,但我总是得到通用的unicode procedure TfMain.btn2Click(Sender: TObject); const Str = 'يبداء'; Ch = 'ب'; begin ShowMessage(IntToHex(Ord(Ch

大多数阿拉伯字母都有多种上下文形式,例如后者具有通用unicode
0628

但如果后者出现在单词的开头,将采用这种形式‎unicode
FE91

中间=
unicode
FE92

词尾=
‎‎
unicode
FE90

我试图得到字符代码,但我总是得到通用的unicode

procedure TfMain.btn2Click(Sender: TObject);
const
  Str  = 'يبداء';
  Ch   = 'ب';
begin
  ShowMessage(IntToHex(Ord(Ch), 4));  // return 0628 - Correct
  ShowMessage(IntToHex(Ord(Str[2]), 4)); // return 0628 - Wrong
end;
问:如何根据字符在单词中的位置获得正确的字符代码

更多信息


我现在把这个想法作为一个完整的解决方案

下面的函数将根据其在传递字符串中的位置,从U形表返回正确的字符

此函数将阿拉伯语语法考虑在内

用法/输出如下所示:

procedure TfMain.btn2Click(Sender: TObject);
const
  cMiddle    = 'يبداء';
  cBeginning = 'بداء';
  cEnd1       = 'ألعاب';
  cEnd2       = 'سحب';
begin
  ShowMessage(IntToHex(Ord(_GetArabicChar(cMiddle, 2)), 4));            // return FE92
  ShowMessage(IntToHex(Ord(_GetArabicChar(cBeginning, 1)), 4));         // return FE91
  ShowMessage(IntToHex(Ord(_GetArabicChar(cEnd2, Length((cEnd2)))), 4));// return FE90
  ShowMessage(IntToHex(Ord(_GetArabicChar(cEnd1, Length((cEnd1)))), 4));// return 0628
end;

我怀疑你的代码工作正常。显示的字符串确实包含字符代码0628,因此读取
Ord(Str[2])
可以得到该值。文本渲染器根据上下文对该字符代码进行不同的解释。当它出现在一个单词的末尾时,它会显示为fe90。另一方面,字符fe90-2是获取上下文相关字形的方法,而不考虑周围的上下文。也就是说,无论
字符串
变量中的相邻位置中有哪些其他字符代码,字符fe90都将显示为字尾图示符。可能的
procedure TfMain.btn2Click(Sender: TObject);
const
  cMiddle    = 'يبداء';
  cBeginning = 'بداء';
  cEnd1       = 'ألعاب';
  cEnd2       = 'سحب';
begin
  ShowMessage(IntToHex(Ord(_GetArabicChar(cMiddle, 2)), 4));            // return FE92
  ShowMessage(IntToHex(Ord(_GetArabicChar(cBeginning, 1)), 4));         // return FE91
  ShowMessage(IntToHex(Ord(_GetArabicChar(cEnd2, Length((cEnd2)))), 4));// return FE90
  ShowMessage(IntToHex(Ord(_GetArabicChar(cEnd1, Length((cEnd1)))), 4));// return 0628
end;