泰语、缅甸语等复杂语言圈圈问题
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
一些复杂语言如泰语、缅甸语、印地语,经常会看到一些带有虚线圈圈字符。这是一种正常的处理机制。对于那些不能单独存在的字符,在显示时额
外添加虚线圈,以提供对于这些字符的含义的一些提示,使得这些字符在显示时能够有增加适当的位置,避免字符的无限叠加等问题。如在Windows7
上的office2010中缅甸语也有同样的行为,如下图:
[SOLUTION]
mtk在JB版本引入了这种机制,如果想去掉圈圈这种机制,可以按照如下方法:
泰语:
JB、JB2版本:
修改文件external\harfbzz\src\harfbuzz-thai.c
注释如下代码
about line 418
case tR:
// charIndex[(*outputIndex)] = inputIndex;
// outputBuffer[(*outputIndex)++] = errorChar;
charIndex[(*outputIndex)] = inputIndex;
outputBuffer[(*outputIndex)++] = currChar;
break;
about line 426
case tS:
// if (currChar == CH_SARA_AM) {
// charIndex[(*outputIndex)] = inputIndex;
// outputBuffer[(*outputIndex)++] = errorChar;
// }
charIndex[(*outputIndex)] = inputIndex;
outputBuffer[(*outputIndex)++] = currChar;
break;
JB3、JB5版本由于变形引擎不同,默认是不带圈圈的,如果想使用这种机制,可以修改:
php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks/base/core/jni/android/graphics/TextLayoutCache.cp
about line 820
switch (script) {
case HB_SCRIPT_MYANMAR:
return &GraphiteLayoutShaper::getInstance();
case HB_SCRIPT_BENGALI:
case HB_SCRIPT_THAI: ////新增此句
harfbuzzShaper.setShapingScript(getHBScriptFROMHBNgScript(script));
return &harfbuzzShaper;
缅甸语:
在KK,L,M版本上修改文件
民间缅甸语 修改harfbuzz_ng\src\hb-old\harfbuzz-zawgyi.c文件,将该文件中
//reordered[len] = Mymr_C_DOTTED_CIRCLE;
//len += 1;
屏蔽一共2处
官方缅甸语修改 harfbuzz_ng\src\hb-old\harfbuzz-myanmar.c文件,将该文件中
// reordered[len] = C_DOTTED_CIRCLE;
// ++len;
屏蔽一共1处。
在JB版本上:
对于官方缅甸语JB3、JB5版本由于变形引擎不同,默认是不带圈圈的,如果想使用这种机制,可以
修改:frameworks/base/core/jni/android/graphics/TextLayoutCache.cp
about line 820
switch (script) {
case HB_SCRIPT_MYANMAR:
//#ifndef ZAWGYI_SUPPORT
// return &GraphiteLayoutShaper::getInstance();
// #endif
//注释上述红色代码
需要注意的是,去掉圈圈机制可以会导致一些字符变形问题,如连续输入上下标、母音等字符,后
面的字将不断往前面的字上面叠。同时由于该solution没能做严格的测试,而有可能存在其他潜在
的风险。在不能单独存在的字符单独出现时去除虚线圈的做法,并不合理,并可能存在其他问题。
如果要去掉,需要评估风险。
缅甸语比较特殊,有官方(Paduak)和民间(Zawgyi)之分,二者不同的是编码机制不同,因此这2种缅
甸语的字串翻译、处理引擎、字库都是不同的。如果遇到问题可以先按照如下方法排查:
1、 如果字串中出现一个圈圈可能是个别字串翻译问题,可以参考FAQ09106解决。
2、如果浏览网页或者界面中出现大量圈圈、这可能是网页内容或者翻译和字库不匹配导致。如大多
缅甸语网站是民间缅甸语的,如果使用官方的缅甸语引擎和字库访问的话,就会出现这个问题。
3、目前MTK仅仅在JB3及以后的版本可以支持民间缅甸语,但是需要申请patch(L和M上不必申请
patch),具体patch可以查看FAQ03761备注。
一些复杂语言如泰语、缅甸语、印地语,经常会看到一些带有虚线圈圈字符。这是一种正常的处理机制。对于那些不能单独存在的字符,在显示时额
外添加虚线圈,以提供对于这些字符的含义的一些提示,使得这些字符在显示时能够有增加适当的位置,避免字符的无限叠加等问题。如在Windows7
上的office2010中缅甸语也有同样的行为,如下图:
[SOLUTION]
mtk在JB版本引入了这种机制,如果想去掉圈圈这种机制,可以按照如下方法:
泰语:
JB、JB2版本:
修改文件external\harfbzz\src\harfbuzz-thai.c
注释如下代码
about line 418
case tR:
// charIndex[(*outputIndex)] = inputIndex;
// outputBuffer[(*outputIndex)++] = errorChar;
charIndex[(*outputIndex)] = inputIndex;
outputBuffer[(*outputIndex)++] = currChar;
break;
about line 426
case tS:
// if (currChar == CH_SARA_AM) {
// charIndex[(*outputIndex)] = inputIndex;
// outputBuffer[(*outputIndex)++] = errorChar;
// }
charIndex[(*outputIndex)] = inputIndex;
outputBuffer[(*outputIndex)++] = currChar;
break;
JB3、JB5版本由于变形引擎不同,默认是不带圈圈的,如果想使用这种机制,可以修改:
php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks/base/core/jni/android/graphics/TextLayoutCache.cp
about line 820
switch (script) {
case HB_SCRIPT_MYANMAR:
return &GraphiteLayoutShaper::getInstance();
case HB_SCRIPT_BENGALI:
case HB_SCRIPT_THAI: ////新增此句
harfbuzzShaper.setShapingScript(getHBScriptFROMHBNgScript(script));
return &harfbuzzShaper;
缅甸语:
在KK,L,M版本上修改文件
民间缅甸语 修改harfbuzz_ng\src\hb-old\harfbuzz-zawgyi.c文件,将该文件中
//reordered[len] = Mymr_C_DOTTED_CIRCLE;
//len += 1;
屏蔽一共2处
官方缅甸语修改 harfbuzz_ng\src\hb-old\harfbuzz-myanmar.c文件,将该文件中
// reordered[len] = C_DOTTED_CIRCLE;
// ++len;
屏蔽一共1处。
在JB版本上:
对于官方缅甸语JB3、JB5版本由于变形引擎不同,默认是不带圈圈的,如果想使用这种机制,可以
修改:frameworks/base/core/jni/android/graphics/TextLayoutCache.cp
about line 820
switch (script) {
case HB_SCRIPT_MYANMAR:
//#ifndef ZAWGYI_SUPPORT
// return &GraphiteLayoutShaper::getInstance();
// #endif
//注释上述红色代码
需要注意的是,去掉圈圈机制可以会导致一些字符变形问题,如连续输入上下标、母音等字符,后
面的字将不断往前面的字上面叠。同时由于该solution没能做严格的测试,而有可能存在其他潜在
的风险。在不能单独存在的字符单独出现时去除虚线圈的做法,并不合理,并可能存在其他问题。
如果要去掉,需要评估风险。
缅甸语比较特殊,有官方(Paduak)和民间(Zawgyi)之分,二者不同的是编码机制不同,因此这2种缅
甸语的字串翻译、处理引擎、字库都是不同的。如果遇到问题可以先按照如下方法排查:
1、 如果字串中出现一个圈圈可能是个别字串翻译问题,可以参考FAQ09106解决。
2、如果浏览网页或者界面中出现大量圈圈、这可能是网页内容或者翻译和字库不匹配导致。如大多
缅甸语网站是民间缅甸语的,如果使用官方的缅甸语引擎和字库访问的话,就会出现这个问题。
3、目前MTK仅仅在JB3及以后的版本可以支持民间缅甸语,但是需要申请patch(L和M上不必申请
patch),具体patch可以查看FAQ03761备注。