我试图在屏幕上表示devanagari字符,但是在我正在编程的dev环境中,我没有unicode支持。然后,为了编写字符,我使用二进制矩阵对相关屏幕的像素进行着色。我按照unicode顺序对这些矩阵进行了排序。对于使用拉丁字母的语言,我没有问题,我只需要一个接一个地写字符来表示一个字符串,但是对于devanagari字符,情况就不同了。
在devanagari脚本中,一些字符,当放置在其他字符旁边时,可以完全改变单词本身的外观,无论是在顺序上还是在字符的外观上。结果字符被认为是单个字符,但当作为unicode读取时,它们实际上返回两个不同的字符。
这种合并有时以一种简单的方式进行:
क+्=क्
ग+्=ग्
फ+ि=फि
但其他时候你会得到完全不同的角色:
क+्+क=क्क
ग+्+घ=ग्घ
क+्+ष=क्ष
我发现了几篇描述这些字符如何合并(https://www.unicode.org/versions/Unicode8.0.0/UnicodeStandard-8.0.pdf)的复杂语法规则的论文,但是我越仔细研究,我就越意识到我需要学习印地语来理解这些规则,然后创建一个算法。
我想了解这些字符组合背后的原则,但不一定要学习印地语。我不知道在我之前是否有人已经解决了这个问题,或者找到了另一个解决办法,并愿意与我分享。
发布于 2022-12-02 20:29:52
无论Devanagari文本是使用Unicode还是ISCII编码的,文本的显示都需要整形引擎和字体数据的组合,将字符串映射到适当的定位符号序列中。Devanagari所需的符号集将比最初的字符集大一些。
形成步骤包括簇的分析,簇内某些元素的重新排序,符号的替换,最后对符号的定位调整。考虑一下这个例子:
क+्+क+ि=क्कि
需要进行聚类分析,以便根据一般的聚类模式来识别要素-例如,构成集群内部的“基本”辅音,这些辅音是与之相连的额外辅音,是元音,以及与视觉定位有关的元音类型。在该序列中,序列将形成元音或其他标记相对定位的基值。第二个ka是“基音”辅音,字母序列将以“半”形式结合在一起。短i元音需要重新定位到辅音组合的左边。
Unicode标准中的Devanagari部分以一般的方式描述了显示中需要的一些操作,但它不是一个具体的实现指南。
OpenType字体规范通过字体中的"OpenType布局“数据的组合以及与该数据交互的整形实现来支持像Devanagari这样的脚本的显示。您可以在这里找到专门用于Devanagari字体实现的文档:
https://learn.microsoft.com/en-us/typography/script-development/devanagari
您可能还会发现“通用成形引擎”的规范很有帮助,几个实现(与OpenType字体结合使用)用于形成许多不同的脚本:
https://learn.microsoft.com/en-us/typography/script-development/use
您不一定需要使用OpenType,但是您需要一些具有我所描述的功能的实现。如果您在一个特定的嵌入式操作系统环境中运行,比如Windows,那么显然不能利用内置在Windows或其他主要操作系统平台中的OpenType成形支持。但是也许你可以利用哈夫巴斯,它是一个开源的OpenType整形库:
https://github.com/harfbuzz/harfbuzz
这将需要与具有适当OpenType布局数据的Devanagari字体相结合,并且有很多这样的字体,包括OSS选项(例如,Noto Sans Devanagari)。
https://stackoverflow.com/questions/74654119
复制相似问题