一些背景知识
字符集测试是什么?
字符集测试是为了测试设备是否能正确处理和显示不同语言和字符集的文本。字符集(Character Set)是指一组字符及其编码方式,用于在计算机系统中表示文本。常见的字符集包括ASCII、ISO-8859、UTF-8、Windows-1256等。
字符集测试的主要目的是验证应用程序在处理不同字符集时,是否能够正确显示文本、处理输入和输出,并确保没有乱码或显示错误。这对于多语言支持和国际化应用程序尤为重要。
为啥要做字符集测试
- 多语言支持: 随着全球化的发展,软件需要支持多种语言,以满足不同地区用户的需求。字符集测试确保软件能够正确处理和显示各种语言的文本。
- 用户体验: 正确显示文本是良好用户体验的基础。字符集测试可以避免因显示错误导致的用户困惑和不满。
- 数据完整性: 在处理和存储文本数据时,字符集测试可以确保数据的完整性和准确性,避免因编码问题导致的数据丢失或损坏。
字符集测试是怎么做的?
把一个字符集的正确显示效果做成图片然后把图片制作成视频,制作对应字符的字幕文件,测试时播放视频文件 ,设定好字幕开关和字符集:Encoding standard为windows region language为Arabic
继续播放,核对画面与字幕是否一致, 如果一致则认为显示正确
碰到的问题
在一个Android设备上大多数 Windows-1256的测试集测试通过,但有几个乌尔都语的字母测试失败,比如下图
问题分析
以第一个为例: 该字母编码为9F 单词为9F9F9F
根据Windows-1256字符集编码表:找到9F对应的字母为:ں 名字叫Arabic Letter Noon Ghunna (U+06BA)
那么9F9F9F对应的单词为啥不是:ں ں ں 呢?而是
ںںں
这是因为阿拉伯语是连续书写的(从右到左),不同于每个文字都单独书写的象形文字,因此每个阿拉伯字母的书写形式会受到词法的影响。
根据阿拉伯文的排版规则,一个词语中的字母会进行Shape (字母位置变形)、Ligature(Combined)(字母连写变形 或称作结合变形)、Diacritics(字母标注变(元)音符号变形)、Kashida(为了凑满一整行字母延长变形)、Tatwell(插入字母链接符号)
因此需要确认对应的变形规则表进行正确的变形:
根据ں - Wiktionary 资料,这个字母在不同语言里的写法不同
在Pashto(普什图语)中,变形表如下
设根据字母位置变形规则:
F9F9F9对应的ں ں ں 根据字母位置变为→
+
+
再把这3个连在一起,并且从右往左书写,就变成了这样:
根据unicode官网资料有关于这个字母的说明: 12381-dotless-noon.pdf (unicode.org)
不同的字体采用了不同的变形规则:
文档中建议采用dotless version即第1种
属于dotless版本与其他版本的区别,所以鉴定完毕这不是个bug,而是字体差异,不过分析这个问题了解一下阿拉伯语的连写规则, 也是一个有趣的冷知识.