成语大全网 - 成语词典 - 如何通过android代码实现汉字转拼音

如何通过android代码实现汉字转拼音

使用HanziToPinyin类实现android代码实现汉字转拼音

对Contacts了解就会知道,每个联系人都有一个sort_key字段,如果查询中没有设置sortOrder,默认就会以 sort_key字段为排序依据。名字的检索其实也是根据sort_key来做的(比如拨号盘的模糊匹配:数字转成字母,再到拼音,最后得到汉字)。sort_key是根据名字生成的:如果联系人名字中包含字母,sort_key和name保持一致;如果名字是汉字,生成的sort_key,拼音-汉字-拼音-汉字。。。其中拼音全大写,中间以空格分割,如:”张三“-----sort_key:"ZHANG 张 SAN 三"。

当名字发生变化Sort_key是在packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java中生成的。具体调用如下:

[java]?view plaincopyprint?

if?(displayNameStyle?==?FullNameStyle.CHINESE?||

displayNameStyle?==?FullNameStyle.CJK)?{

sortKeyPrimary?=?sortKeyAlternative?=

ContactLocaleUtils.getIntance().getSortKey(

displayNamePrimary,?displayNameStyle);

}

调用了packages\providers\contactsprovider\src\com\android\providers \contacts\ContactLocaleUtils.java中的ChineseContactUtils.getSortKey()方法,具体实现如下:

[java]?view plaincopyprint?

ContactLocaleUtils.getIntance();

取得实例,然后调用:

[java]?view plaincopyprint?

1.public?String?getSortKey(String?displayName,?int?nameStyle)?{

return?getForSort(Integer.valueOf(nameStyle)).getSortKey(displayName);

}

2.?@Override

public?String?getSortKey(String?displayName)?{

ArrayList<Token>?tokens?=?HanziToPinyin.getInstance().get(displayName);

if?(tokens?!=?null?&&?tokens.size()?>?0)?{

StringBuilder?sb?=?new?StringBuilder();

for?(Token?token?:?tokens)?{

//?Put?Chinese?character's?pinyin,?then?proceed?with?the

//?character?itself.

if?(Token.PINYIN?==?token.type)?{

if?(sb.length()?>?0)?{

sb.append('?');

}

sb.append(token.target);

sb.append('?');

sb.append(token.source);

}?else?{

if?(sb.length()?>?0)?{

sb.append('?');

}

sb.append(token.source);

}

}

return?sb.toString();

}

return?super.getSortKey(displayName);

}

以上调用了frameworks/base/core/java/com/android/internal/util/HanziToPinyin.java(下文附源码)中的方法得到了拼音,当然转换实现需要本地的支持,但是此处只要取得这个文件即可完成在android上从汉字到拼音的转换。从路径可以看出HanziToPinyin.java是一个内部类,不能直接调用,不过可以把这个文件取出来放在自己的项目中直接使用。调用也很简单方便,上边基本给出了,看下HanziToPinyin的源码就比较清楚了。以下是我写的一个调用:输入汉字返回拼音,字母原样返回,都转换为小写(默认取得的拼音全大写)。

[java]?view plaincopyprint?

package?com.spare.pinyin;

import?java.util.ArrayList;

import?com.spare.pinyin.HanziToPinyin.Token;

public?class?PinYin?{

//汉字返回拼音,字母原样返回,都转换为小写(默认取得的拼音全大写)

public?static?String?getPinYin(String?input)?{

ArrayList<Token>?tokens?=?HanziToPinyin.getInstance().get(input);

StringBuilder?sb?=?new?StringBuilder();

if?(tokens?!=?null?&&?tokens.size()?>?0)?{

for?(Token?token?:?tokens)?{

if?(Token.PINYIN?==?token.type)?{

sb.append(token.target);

}?else?{

sb.append(token.source);

}

}

}

return?sb.toString().toLowerCase();

}

}