Android 泰语、缅甸语等复杂语言圈圈问题

前言
         欢迎大家我分享和推荐好用的代码段~~
声明
         欢迎转载,但请保留文章原始出处:
         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;

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版本由于变形引擎不同,默认是不带圈圈的,如果想使用这种机制,可以修改: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工程师。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值