前言
欢迎大家我分享和推荐好用的代码段~~
声明
欢迎转载,但请保留文章原始出处:
CSDN:http://www.csdn.net
雨季o莫忧离:http://blog.csdn.net/luckkof
正文
一些复杂语言如泰语、缅甸语、印地语,经常会看到一些带有虚线圈圈字符。这是一种正常的处理机制。对于那些不能单独存在的字符,在显示时额外添加虚线圈,以提供对于这些字符的含义的一些提示,使得这些字符在显示时能够有更加适当的位置,避免字符的无限叠加等问题。如在Windows7上的office2010中缅甸语也有同样的行为,如下图:
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;
case tS:
// if (currChar == CH_SARA_AM) {
// charIndex[(*outputIndex)] = inputIndex;
// outputBuffer[(*outputIndex)++] = errorChar;
// }
charIndex[(*outputIndex)] = inputIndex;
outputBuffer[(*outputIndex)++] = currChar;
break;
JB3、JB5版本由于变形引擎不同,默认是不带圈圈的,如果想使用这种机制,可以修改: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;
default:
harfbuzzNgShaper.setShapingScript(script);
return &harfbuzzNgShaper;
}
缅甸语:
JB、JB2版本:
external\harfbzz\src\harfbuzz-myanmar.c
注释如下代码就行,一共有三处。
// reordered[len] = Mymr_C_DOTTED_CIRCLE;
// len += 1;
JB3、JB5版本由于变形引擎不同,默认是不带圈圈的,如果想使用这种机制,可以修改:frameworks/base/core/jni/android/graphics/TextLayoutCache.cp
about line 820
switch (script) {
case HB_SCRIPT_MYANMAR:
// return &GraphiteLayoutShaper::getInstance();注释此句
case HB_SCRIPT_BENGALI:
harfbuzzShaper.setShapingScript(getHBScriptFromHBNgScript(script));
return &harfbuzzShaper;
default:
harfbuzzNgShaper.setShapingScript(script);
return &harfbuzzNgShaper;
}
需要注意的是,去掉圈圈机制可以会导致一些字符变形问题,如连续输入上下标、母音等字符,后面的字将不断往前面的字上面叠。同时由于该solution没能做严格的测试,而有可能存在其他潜在的风险。在不能单独存在的字符单独出现时去除虚线圈的做法,并不合理,并可能存在其他问题。如果要去掉,需要评估风险。
另外缅甸语比较特殊、缅甸语有官方和民间之分,二者不同的是编码机制不同,因此这2种缅甸语的字串翻译、处理引擎、字库都是不同的。如果遇到问题可以先按照如下方法排查:
1、 如果字串中出现一个圈圈可能是个别字串翻译问题,可以参考FAQ09106解决。
2、 如果浏览网页或者界面中出现大量圈圈、这可能是网页内容或者翻译和字库不匹配导致。如大多缅甸语网站是民间缅甸语的,如果使用官方的缅甸语引擎和字库访问的话,就会出现这个问题。
目前mtk仅仅支持官方的缅甸语,如果要支持民间缅甸语,通过简单修改(修改翻译、替换字库)存在诸多风险,需要自行评估或者咨询mtk工程师。