阿拉伯语:’源’Unicode以最终显示Unicode
简单的问题:
这是我正在寻找的最终显示字符串
لعبةديدة
现在下面是每个单独的字符,然后被“粘合”在一起(所以我在每个字符之间放置一个空格来停止加入)
لعبدةديدة
注意它们是不是相同的字符,有一些神奇的变换将它们融合在一起并将它们转换为新的Unicode字符。
然后在上面,字符实际上是从右到左出现(在内存中,它们是从左到右)
所以我的简单问题是:我在哪里获得一个独立于平台的c / c ++函数,它将获取我的源16位Unicode字符串,并对其进行转换以产生将创建上面首次引用的Unicode字符串? 进行RTL转换和加入?
这就是我想要的,一个function就是这样。
更新:
好的,是的,我知道上面两个例子中的’字符’是相同的,它们是相同的’字母’但是(在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的双向文本function,渲染引擎可以使用正确的方向显示字符。 在这方面,如果此页面上的阿拉伯语单词是从左向右书写的,则表明用于显示它们的Unicode呈现引擎已过时。
您正在寻找的处理称为连字 。 与许多基于拉丁语的语言不同,你可以简单地将一个字符放在另一个字符来渲染文本,而连字是阿拉伯语的基础。 替换在文本呈现引擎中完成,绑定信息通常存储在字体文件中。
注意它们是不是相同的字符
对于阿拉伯语读者来说,它们是相同的。 它仍然可读。 您的Unicode16源文本没有转换。 您必须将整个字符串提供给文本渲染器。 在C / C ++中,当您采用独立于平台的方式时,您可以使用Pango进行渲染。
注意:也许你想写 لعبةجديدة(即新游戏)? 因为你给出的例子在阿拉伯语中没有意义。
我意识到这是一个老问题,但你要找的是FriBidi , Unicode双向算法的GNU实现。
该程序执行问题中询问的字形选择,以及处理双向文本(从右到左和从左到右文本的混合)。
您正在寻找的是阿拉伯语脚本综合算法。 我不知道有一个作为开源存在。 如果您到达一个请发布。
一些要点:
在存储级别,没有Unicode转换。 其他答案指出了字符串的抽象表示。
在呈现级别,您可以选择使用Unicode Presentation Forms,但您也可以选择使用其他表单。 Unicode表示forms不是表示输出编码应该是什么的标准 – 而是它们只是渲染引擎使用脚本合成输出的表示代码的一个示例。
为了更清楚:没有单一的标准转换(即合成算法)将从A转换为B,其中A是标准的Unicode阿拉伯语页面,B是标准的Unicode阿拉伯语表示forms。 相反,会有不同的变换可以在复杂性上变化并且可以具有针对B的不同编码系统,但是可以用于B的编码之一是Unicode表示forms。 例如,简单的打字机样式需要一个不需要Presentation Forms的简单渲染算法。 确实存在现代写作风格(虽然不常见),其中A和B实际上是相同的,只是使用不同的字体页面来进行渲染。 另一方面,渲染排版或传统书法forms的转换将更复杂,并且需要类似于Unicode演示表单的内容。
以下是有关该主题的更多信息的几点建议:
请访问: http : //www.fileformat.info/info/unicode/block/arabic_presentation_forms_b/list.htm并查看此回购: https : //github.com/Accorpa/Arabic-Converter-From-and-为了阿拉伯语的演示,表格-B