汉字转拼音android实现(HanziToPinyin类)

本文解析了Android系统中联系人排序的实现方式,重点介绍了sort_key字段的生成逻辑及其与姓名的关系,包括汉字姓名如何转化为拼音进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        对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 plain copy print ?
  1. if (displayNameStyle == FullNameStyle.CHINESE ||  
  2.                     displayNameStyle == FullNameStyle.CJK) {  
  3.                 sortKeyPrimary = sortKeyAlternative =  
  4.                         ContactLocaleUtils.getIntance().getSortKey(  
  5.                                 displayNamePrimary, displayNameStyle);  
  6.             }  

       调用了packages\providers\contactsprovider\src\com\android\providers \contacts\ContactLocaleUtils.java中的ChineseContactUtils.getSortKey()方法,具体实现如下:
[java]  view plain copy print ?
  1. ContactLocaleUtils.getIntance();  

取得实例,然后调用

[java]  view plain copy print ?
  1. 1.  public String getSortKey(String displayName, int nameStyle) {  
  2.         return getForSort(Integer.valueOf(nameStyle)).getSortKey(displayName);  
  3.     }  
  4.   
  5. 2.     @Override  
  6.         public String getSortKey(String displayName) {  
  7.             ArrayList<Token> tokens = HanziToPinyin.getInstance().get(displayName);  
  8.             if (tokens != null && tokens.size() > 0) {  
  9.                 StringBuilder sb = new StringBuilder();  
  10.                 for (Token token : tokens) {  
  11.                     // Put Chinese character's pinyin, then proceed with the  
  12.                     // character itself.  
  13.                     if (Token.PINYIN == token.type) {  
  14.                         if (sb.length() > 0) {  
  15.                             sb.append(' ');  
  16.                         }  
  17.                         sb.append(token.target);  
  18.                         sb.append(' ');  
  19.                         sb.append(token.source);  
  20.                     } else {  
  21.                         if (sb.length() > 0) {  
  22.                             sb.append(' ');  
  23.                         }  
  24.                         sb.append(token.source);  
  25.                     }  
  26.                 }  
  27.                 return sb.toString();  
  28.             }  
  29.             return super.getSortKey(displayName);  
  30.         }  

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

[java]  view plain copy print ?
  1. package com.spare.pinyin;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import com.spare.pinyin.HanziToPinyin.Token;  
  6.   
  7. public class PinYin {  
  8.     //汉字返回拼音,字母原样返回,都转换为小写(默认取得的拼音全大写)  
  9.     public static String getPinYin(String input) {  
  10.         ArrayList<Token> tokens = HanziToPinyin.getInstance().get(input);  
  11.         StringBuilder sb = new StringBuilder();  
  12.         if (tokens != null && tokens.size() > 0) {  
  13.             for (Token token : tokens) {  
  14.                 if (Token.PINYIN == token.type) {  
  15.                     sb.append(token.target);  
  16.                 } else {  
  17.                     sb.append(token.source);  
  18.                 }  
  19.             }  
  20.         }  
  21.         return sb.toString().toLowerCase();  
  22.     }  
  23. }  


以下附上frameworks/base /core/java/com/android/internal/util/HanziToPinyin.java源码


更新:4.X上代码位置已变更packages/providers/ContactsProvider/src/com/android/providers/contacts/HanziToPinyin.java,内容也有所改变,已基于android4.2源码提取并上传。在2.X和4.X上均测试通过。

下载地址http://download.youkuaiyun.com/detail/spare_h/4881592

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值