C++ 阿拉伯文:';来源';Unicode到最终显示Unicode

C++ 阿拉伯文:';来源';Unicode到最终显示Unicode,c++,c,arabic,C++,C,Arabic,简单问题: 这是我要查找的最后一个显示字符串 لعبة ديدة 下面是每个单独的字符,在“粘”在一起之前(所以我在每个字符之间加了一个空格以阻止连接) ل ع ب ة د ي د ة 请注意它们是如何不同的字符,有一些神奇的转换将它们融合在一起,并将它们转换为新的Unicode字符 在上面的例子中,字符实际上是从右到左出现的(在内存中,它们是从左到右) 因此,我的简单问题是:我从哪里获得一个独立于平台的c/c++函数,该函数将获取我的源16位Unicode字符串,并对其进行转换以生成Unic

简单问题:

这是我要查找的最后一个显示字符串

لعبة ديدة 下面是每个单独的字符,在“粘”在一起之前(所以我在每个字符之间加了一个空格以阻止连接)

ل ع ب ة د ي د ة 请注意它们是如何不同的字符,有一些神奇的转换将它们融合在一起,并将它们转换为新的Unicode字符

在上面的例子中,字符实际上是从右到左出现的(在内存中,它们是从左到右)

因此,我的简单问题是:我从哪里获得一个独立于平台的c/c++函数,该函数将获取我的源16位Unicode字符串,并对其进行转换以生成Unicode字符串,该字符串将创建上面引用的第一个字符串?进行RTL转换和连接

这就是我想要的,一个可以做到这一点的函数

更新:

好的,是的,我知道上面两个例子中的“字符”是相同的,它们是相同的“字母”,但是(在chrome或最新IE中查看)任何人都可以清楚地看到标志符号是不同的。现在,我非常确信,需要进行的转换可以在unicode级别上完成,因为我的字体文件和unicode标准似乎为字符/字母的单独版本和各种连接版本指定了不同的标志符号。(unicode.org/charts/PDF/UFB50.PDF unicode.org/charts/PDF/UFE70.PDF)


那么,我可以将我的unicode放入一个函数中,然后将转换后的unicode输出吗?

连接和RTL转换不会发生在unicode字符级别

换句话说:在这个过程中,字符的顺序和实际的unicode代码点没有改变

事实上,合并和处理RTL/LTR转换是由文本呈现引擎处理的

这句话很好地解释了这一点:

最后,阿拉伯文的Unicode编码是按逻辑顺序进行的,也就是说,输入字符并将其存储在计算机内存中,其顺序是书写和发音,而不必担心字符在纸上或屏幕上的显示方向。同样,由渲染引擎使用Unicode的功能以正确的方向显示字符。在这方面,如果此页面上的阿拉伯语从左向右书写,则表示用于显示它们的Unicode呈现引擎已过时


您正在寻找的处理称为。与许多以拉丁语为基础的语言不同,在拉丁语中,你可以简单地将一个字符接一个字符来呈现文本,连字在阿拉伯语中是最基本的。替换在文本呈现引擎中完成,连字信息通常存储在字体文件中

请注意它们是如何不同的字符

对于阿拉伯语读者来说也是如此。它仍然可读。 在Unicode 16源文本上没有要执行的转换。必须向文本渲染器提供整个字符串。在C/C++中,当您采用独立于平台的方式时,可以使用来进行渲染


注:也许你想写新游戏?因为您给出的示例在阿拉伯语中没有任何意义。

您正在寻找的是阿拉伯语脚本合成算法。我不知道有一个是开源的。如果你在一点到达,请邮寄

一些要点:

在存储级别,没有Unicode转换。正如其他答案所指出的,字符串有一个抽象的表示形式

在呈现级别,您可以选择使用Unicode表示形式,但也可以选择使用其他形式。Unicode表示形式不是表示输出编码应该是什么的标准-相反,它们只是表示代码的一个示例,可以由渲染引擎使用脚本合成输出

更清楚地说:不会有一个单一的标准转换(即合成算法)将a转换为B,其中a是标准的Unicode阿拉伯语页面,B是标准的Unicode阿拉伯语表示形式。相反,会有不同的转换,这些转换的复杂度可能不同,B的编码系统也可能不同,但B可以使用的编码之一是Unicode表示形式。 例如,简单的打字机样式需要一个简单的呈现算法,而不需要呈现形式。事实上,现在确实存在A和B实际上完全相同的现代书写风格(虽然不常用),只是会使用不同的字体页面进行渲染。另一方面,呈现排版或传统书法形式的转换将更加复杂,并且需要类似于Unicode表示形式的东西

以下是有关该主题的更多信息的几点提示:


我意识到这是一个老问题,但您要寻找的是的GNU实现


该程序执行问题中询问的字形选择,以及处理双向文本(从右到左和从左到右的混合文本)

请查看:并查看此报告:

对于阿拉伯语不流利的人,您能指出其区别吗?除了第一个字符串中的连接符和第二个字符串中的空格外,这两个字符串看起来完全相同。这些都是意料之中的。此外,内存中的字符串存储在从低到高的地址,而不是从左到右。LTR就是你呈现拉丁字体的方式。内存没有左/右。我不知道有哪家标准库能做到这一点(尽管我确信有一些标准库),但你需要谷歌搜索的短语是“逻辑到视觉的转换”。代码点存储为“逻辑”字符,但您需要将其转换为