解决HanziToPinyin中Collator.getAvailableLocales()在小米、HTC One等手机上获取本地语言环境不匹配转换拼音失败BUG

原因: 
让我们看看源码是怎么写的,我做了一下修复,稍后再介绍:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> HanziToPinyin <span class="hljs-title" style="box-sizing: border-box;">getInstance</span>() {  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> (HanziToPinyin.class) {  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (sInstance != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) {  
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> sInstance;  
        }  
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Check if zh_CN collation data is available  </span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> Locale locale[] = Collator.getAvailableLocales();  
        Locale newChina = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Locale(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"zh"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"HANS"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CN"</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//这部分是我做的修复,解决HTC兼容性问题  </span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < locale.length; i++) {  
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (locale[i].equals(Locale.CHINA) || locale[i].equals(newChina)) {  
                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Do self validation just once.  </span>
                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (DEBUG) {  
                    Log.d(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Self validation. Result: "</span> + doSelfValidation());  
                }  
                sInstance = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> HanziToPinyin(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>);  
                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> sInstance;  
            }  
        }  
        Log.w(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"There is no Chinese collator, HanziToPinyin is disabled"</span>);  
        sInstance = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> HanziToPinyin(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>);  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> sInstance;  
    }  
}  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

上面的代码可以看到做了一下检测,看看是不是支持中文,而HTC手机里返回的是zh-Hans-CN,所以自然会返回失败,但是手机确实支持中文,经过调试以后发现返回的Locale数组里有这个东西zh-Hans-CN,我们再看下zh-Hans-CN是什么

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hans</span> 简体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hans</span><span class="hljs-attribute" style="box-sizing: border-box;">-CN</span> 大陆地区使用的简体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hans</span><span class="hljs-attribute" style="box-sizing: border-box;">-HK</span> 香港地区使用的简体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hans</span><span class="hljs-attribute" style="box-sizing: border-box;">-MO</span> 澳门使用的简体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hans</span><span class="hljs-attribute" style="box-sizing: border-box;">-SG</span> 新加坡使用的简体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hans</span><span class="hljs-attribute" style="box-sizing: border-box;">-TW</span> 台湾使用的简体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hant</span> 繁体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hant</span><span class="hljs-attribute" style="box-sizing: border-box;">-CN</span> 大陆地区使用的繁体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hant</span><span class="hljs-attribute" style="box-sizing: border-box;">-HK</span> 香港地区使用的繁体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hant</span><span class="hljs-attribute" style="box-sizing: border-box;">-MO</span> 澳门使用的繁体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hant</span><span class="hljs-attribute" style="box-sizing: border-box;">-SG</span> 新加坡使用的繁体中文  
zh<span class="hljs-attribute" style="box-sizing: border-box;">-Hant</span><span class="hljs-attribute" style="box-sizing: border-box;">-TW</span> 台湾使用的繁体中文  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

可以看出,Hans是简体中文,Hant是繁体中文。而这样划分更明确。貌似Win8也是这样划分的。 
解决方案: 
解决方案我已经在原因里贴上去了,其实也就是加入对hans这样的判断,希望兼容5.0,感觉5.0应该也会这样写吧。

转自

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值