阿拉伯字符在字符串中的位置是否有不同的Unicode代码点?

阿拉伯字符在字符串中的位置是否有不同的Unicode代码点?,unicode,arabic,Unicode,Arabic,阿拉伯字符在字符串中的位置是否有不同的Unicode代码点,或者这是一种直观的解决方案 这是同一个单词,3次,带空格,不带空格 看起来是相同的Unicode值 عبى‎ عرب ى‎ ع ربى‎ 我需要做的是扫描阿拉伯字符串列表,并获取它们的值。使用这些值,我将选择要显示的特定字母的图标。 但是,如果它是同一个代码点,意思是我需要在代码中创建自己的逻辑,这是我想要避免的。不同的形状有不同的unicode,例如字母ت\u062A有所有这些不同形状的代码:\uFE95ﺕ , \uFE97ﺗ,

阿拉伯字符在字符串中的位置是否有不同的Unicode代码点,或者这是一种直观的解决方案

这是同一个单词,3次,带空格,不带空格 看起来是相同的Unicode值

عبى‎
عرب ى‎
ع ربى‎

我需要做的是扫描阿拉伯字符串列表,并获取它们的值。使用这些值,我将选择要显示的特定字母的图标。
但是,如果它是同一个代码点,意思是我需要在代码中创建自己的逻辑,这是我想要避免的。

不同的形状有不同的unicode,例如字母ت
\u062A
有所有这些不同形状的代码:
\uFE95
ﺕ , <代码>\uFE97ﺗ, <代码>\uFE98ﺘ , <代码>\uFE96ﺖ.

不过,大多数情况下,阿拉伯文文本使用的是未定型的unicode。成形形式仅用于渲染。因此,如果你通过一个程序检查你的文本,你会发现它大部分都是未定型的

如果希望所有字母都成形,可以使用以下整形器库:

如果希望所有字母都不成形,请使用“向下成形”贴图将字母转换为其主形状

这是一张成形图:

SHAPING = {
 u'\u0621' : ( u'\uFE80' ) ,
 u'\u0622' : ( u'\uFE81', u'\uFE82' ) ,
 u'\u0623' : ( u'\uFE83', u'\uFE84' ) ,
 u'\u0624' : ( u'\uFE85' , u'\uFE86' ) ,
 u'\u0625' : ( u'\uFE87' , u'\uFE88' ) ,
 u'\u0626' : ( u'\uFE89' , u'\uFE8B' , u'\uFE8C' , u'\uFE8A' ) ,
 u'\u0627' : ( u'\uFE8D' , u'\uFE8E' ) ,
 u'\u0628' : ( u'\uFE8F' , u'\uFE91' , u'\uFE92' , u'\uFE90' ) ,
 u'\u0629' : ( u'\uFE93' , u'\uFE94' ) ,
 u'\u062A' : ( u'\uFE95' , u'\uFE97' , u'\uFE98' , u'\uFE96' ) ,
 u'\u062B' : ( u'\uFE99' , u'\uFE9B' , u'\uFE9C' , u'\uFE9A' ) ,
 u'\u062C' : ( u'\uFE9D' , u'\uFE9F' , u'\uFEA0', u'\uFE9E' ) ,
 u'\u062D' : ( u'\uFEA1' , u'\uFEA3' , u'\uFEA4' , u'\uFEA2' ) ,
 u'\u062E' : ( u'\uFEA5' , u'\uFEA7' , u'\uFEA8' , u'\uFEA6' ) ,
 u'\u062F' : ( u'\uFEA9' , u'\uFEAA' ) ,
 u'\u0630' : ( u'\uFEAB'  , u'\uFEAC' ) ,
 u'\u0631' : ( u'\uFEAD' , u'\uFEAE' ) ,
 u'\u0632' : ( u'\uFEAF'  , u'\uFEB0' ) ,
 u'\u0633' : ( u'\uFEB1' , u'\uFEB3' , u'\uFEB4' , u'\uFEB2' ) ,
 u'\u0634' : ( u'\uFEB5' , u'\uFEB7' , u'\uFEB8' , u'\uFEB6' ) ,
 u'\u0635' : ( u'\uFEB9' , u'\uFEBB' , u'\uFEBC' , u'\uFEBA' ) ,
 u'\u0636' : ( u'\uFEBD' , u'\uFEBF' , u'\uFEC0' , u'\uFEBE' ) ,
 u'\u0637' : ( u'\uFEC1' , u'\uFEC3' , u'\uFEC4' , u'\uFEC2' ) ,
 u'\u0638' : ( u'\uFEC5' , u'\uFEC7' , u'\uFEC8' , u'\uFEC6' ) ,
 u'\u0639' : ( u'\uFEC9' , u'\uFECB' , u'\uFECC' , u'\uFECA' ) ,
 u'\u063A' : ( u'\uFECD' , u'\uFECF' , u'\uFED0', u'\uFECE' ) ,
 u'\u0640' : ( u'\u0640' ) ,
 u'\u0641' : ( u'\uFED1' , u'\uFED3' , u'\uFED4' , u'\uFED2' ) ,
 u'\u0642' : ( u'\uFED5' , u'\uFED7' , u'\uFED8' , u'\uFED6' ) ,
 u'\u0643' : ( u'\uFED9' , u'\uFEDB' , u'\uFEDC' , u'\uFEDA' ) ,
 u'\u0644' : ( u'\uFEDD' , u'\uFEDF' , u'\uFEE0', u'\uFEDE' ) ,
 u'\u0645' : ( u'\uFEE1' , u'\uFEE3' , u'\uFEE4' , u'\uFEE2' ) ,
 u'\u0646' : ( u'\uFEE5' , u'\uFEE7' , u'\uFEE8' , u'\uFEE6' ) ,
 u'\u0647' : ( u'\uFEE9' , u'\uFEEB' , u'\uFEEC' , u'\uFEEA' ) ,
 u'\u0648' : ( u'\uFEED' , u'\uFEEE' ) ,
 u'\u0649' : ( u'\uFEEF' , u'\uFEF0' ) ,
 u'\u064A' : ( u'\uFEF1' , u'\uFEF3' , u'\uFEF4' , u'\uFEF2' )
}

阿拉伯语有5个字符块,保留在:

  • U+0600。。U+06FF阿拉伯语
  • U+0750。。U+077F阿拉伯文补编
  • U+08A0。。U+08FF阿拉伯语扩展A
  • U+FB50。。U+FDFF阿拉伯语表示形式A
  • U+FE70。。U+FEFF阿拉伯文演示表格B
问题中的示例文本均使用4个代码点进行编码:

  • UTF-8 0xD8 0xB9=U+0639=阿拉伯文字母AIN
  • UTF-8 0xD8 0xB1=U+0631=阿拉伯文字母REH
  • UTF-8 0xD8 0xA8=U+0628=阿拉伯文字母BEH
  • UTF-8 0xD9 0x89=U+0649=阿拉伯文字母ALEF MAKSURA
此外,还存在以下空间和一些实例:

  • UTF-8 0xE2 0x80 0x8E=U+200E=左右标记(LRM)

尽管用于存储数据的Unicode代码点相同,但阿拉伯字母的显示方式不同,这表明您需要调整显示的字形,使其相对于其他字符(开头、中间、字尾或独立字符)的位置。您可以阅读第9章()以了解更多有关处理阿拉伯语文本的信息

请阅读Unicode格式的阿拉伯语维基百科条目。答案是:可能。文本呈现引擎和/或字体文件本身中的OpenType指令可能会以不同方式呈现孤立的形状。答案是“是”。在阿拉伯语脚本中,字母的形状根据周围的字母而变化。一个字母的不同形状由相同的代码点表示。@roeland:只是没那么简单,因为Unicode还为字母的起始、中间和结尾形式提供了代码点。JAVA中有没有阿拉伯语整形器?c#中的阿拉伯语整形器如何?@BigOther,为这种直接的方法道歉。我注意到你参与了以前的一个阿拉伯SE网站提案。所以我想你可能有兴趣支持一个新的。请广为宣传以获得更广泛的支持:要将异形字符转换为非异形字符(或使用不同的术语,将通用字符转换为表示字符),您可以使用
unicodedata.normalize(“NFKC”,string)
unicodedata.normalize。(“NFKD”,string)
SHAPING = {
 u'\u0621' : ( u'\uFE80' ) ,
 u'\u0622' : ( u'\uFE81', u'\uFE82' ) ,
 u'\u0623' : ( u'\uFE83', u'\uFE84' ) ,
 u'\u0624' : ( u'\uFE85' , u'\uFE86' ) ,
 u'\u0625' : ( u'\uFE87' , u'\uFE88' ) ,
 u'\u0626' : ( u'\uFE89' , u'\uFE8B' , u'\uFE8C' , u'\uFE8A' ) ,
 u'\u0627' : ( u'\uFE8D' , u'\uFE8E' ) ,
 u'\u0628' : ( u'\uFE8F' , u'\uFE91' , u'\uFE92' , u'\uFE90' ) ,
 u'\u0629' : ( u'\uFE93' , u'\uFE94' ) ,
 u'\u062A' : ( u'\uFE95' , u'\uFE97' , u'\uFE98' , u'\uFE96' ) ,
 u'\u062B' : ( u'\uFE99' , u'\uFE9B' , u'\uFE9C' , u'\uFE9A' ) ,
 u'\u062C' : ( u'\uFE9D' , u'\uFE9F' , u'\uFEA0', u'\uFE9E' ) ,
 u'\u062D' : ( u'\uFEA1' , u'\uFEA3' , u'\uFEA4' , u'\uFEA2' ) ,
 u'\u062E' : ( u'\uFEA5' , u'\uFEA7' , u'\uFEA8' , u'\uFEA6' ) ,
 u'\u062F' : ( u'\uFEA9' , u'\uFEAA' ) ,
 u'\u0630' : ( u'\uFEAB'  , u'\uFEAC' ) ,
 u'\u0631' : ( u'\uFEAD' , u'\uFEAE' ) ,
 u'\u0632' : ( u'\uFEAF'  , u'\uFEB0' ) ,
 u'\u0633' : ( u'\uFEB1' , u'\uFEB3' , u'\uFEB4' , u'\uFEB2' ) ,
 u'\u0634' : ( u'\uFEB5' , u'\uFEB7' , u'\uFEB8' , u'\uFEB6' ) ,
 u'\u0635' : ( u'\uFEB9' , u'\uFEBB' , u'\uFEBC' , u'\uFEBA' ) ,
 u'\u0636' : ( u'\uFEBD' , u'\uFEBF' , u'\uFEC0' , u'\uFEBE' ) ,
 u'\u0637' : ( u'\uFEC1' , u'\uFEC3' , u'\uFEC4' , u'\uFEC2' ) ,
 u'\u0638' : ( u'\uFEC5' , u'\uFEC7' , u'\uFEC8' , u'\uFEC6' ) ,
 u'\u0639' : ( u'\uFEC9' , u'\uFECB' , u'\uFECC' , u'\uFECA' ) ,
 u'\u063A' : ( u'\uFECD' , u'\uFECF' , u'\uFED0', u'\uFECE' ) ,
 u'\u0640' : ( u'\u0640' ) ,
 u'\u0641' : ( u'\uFED1' , u'\uFED3' , u'\uFED4' , u'\uFED2' ) ,
 u'\u0642' : ( u'\uFED5' , u'\uFED7' , u'\uFED8' , u'\uFED6' ) ,
 u'\u0643' : ( u'\uFED9' , u'\uFEDB' , u'\uFEDC' , u'\uFEDA' ) ,
 u'\u0644' : ( u'\uFEDD' , u'\uFEDF' , u'\uFEE0', u'\uFEDE' ) ,
 u'\u0645' : ( u'\uFEE1' , u'\uFEE3' , u'\uFEE4' , u'\uFEE2' ) ,
 u'\u0646' : ( u'\uFEE5' , u'\uFEE7' , u'\uFEE8' , u'\uFEE6' ) ,
 u'\u0647' : ( u'\uFEE9' , u'\uFEEB' , u'\uFEEC' , u'\uFEEA' ) ,
 u'\u0648' : ( u'\uFEED' , u'\uFEEE' ) ,
 u'\u0649' : ( u'\uFEEF' , u'\uFEF0' ) ,
 u'\u064A' : ( u'\uFEF1' , u'\uFEF3' , u'\uFEF4' , u'\uFEF2' )
}