关于android汉字转化拼音的一个说明

这段时间做了一个侧边栏根据字母显示的ListView,不想每次都去写一个,所以就自己草草封装了一个不完全版本的KGLetterSideBar,因为之前做过的要么是英语,要么有自己的拼音库,这让我太不方便了,于是乎我想看看是不是有一种把汉字的拼音拿到的库之类的啥,搜了下,一般有两种做法:

  • HanziToPinyin
  • Pinyin4j

这两个有什么区别大家可以去搜索下,挺多的,不过好像很多人推荐HanziToPinyin,因为Pinyin4j貌似不支持多音字

我在这里用了HanziToPinyin,其实感觉用法挺简单的,但是我怎么都转换不成功,不知道是为什么,后面调试了一下,发现了这句关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static HanziToPinyin getInstance() {
synchronized (HanziToPinyin.class) {
if (sInstance != null) {
return sInstance;
}
// Check if zh_CN collation data is available
final Locale locale[] = Collator.getAvailableLocales();
for (int i = 0; i < locale.length; i++) {
if (locale[i].equals(Locale.CHINA)) {
// Do self validation just once.
if (DEBUG) {
Log.d(TAG, "Self validation. Result: " + doSelfValidation());
}
sInstance = new HanziToPinyin(true);
return sInstance;
}
}
Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");
sInstance = new HanziToPinyin(false);
return sInstance;
}
}

其中的:

1
if (locale[i].equals(Locale.CHINA))

始终为false,百思不得其解,后面在网上查了不少资料才知道,因为Collator本来就是去调的icu (International Components for Unicode)
我们可以通过Collator.getAvailableLocales()来查看有没有支持的语言
但是每个手机又不尽相同, 想说爱你不容易啊
先看看自带只能获取的locale
和中文相关的就一下这些:

  • zh
  • zh_HANS 简体中文
  • zh_HANS_CN 大陆简体中文
  • zh_HANS_SG 新加坡简体中文
  • zh_HANT 繁体中文
  • zh_HANT_HK 香港繁体中文
  • zh_HANT_MO 澳门繁体中文
  • zh_HANT_TW 台湾繁体中文

目前只有这几款(HANS 简体 HANT 繁体)
难怪不行,而且我看有人说各个手机可能会有差异,所以我在这里改了一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static boolean isChinaCollator() {
Locale[] localeArray = Collator.getAvailableLocales();
if (localeArray.length > 0) {
List<Locale> locales = Arrays.asList(localeArray);
for (int i = 0; i < locales.size(); i++) {
if (Locale.CHINA.equals(locales.get(i))) {
return true;
}
}
}

if (isAdaptationLocale()) {
return true;
}

return false;
}


private static boolean isAdaptationLocale() {
boolean isAdaptation = false;
if (Locale.getDefault().equals(Locale.CHINA)) {
isAdaptation = true;
}
return isAdaptation;
}

因为我手机Nexus5获取Locale.getDefault()的值为zh_CN,而这个是上面locale[]列表里面没有的,所以相当于在isAdaptationLocale方法里面做了一个小小的适配,以后对其他手机的不同我也会及时更新