原因:
让我们看看源码是怎么写的,我做了一下修复,稍后再介绍:
<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应该也会这样写吧。