获取汉字拼音首字母

最近在做一个拨打网络电话的应用,光数据库设计这一块就头疼了很久,需要创建独立的数据库,而不是直接使用手机联系人数据库。既然独立创建,那就需要模拟一份手机联系人的数据库信息。

应用设计到电话接打,信息收发,联系人列表,通话记录,信息统计这样的一些业务。所以觉得这个数据设计应该不是很简单。不过有多不简单就不说了。现在需要解决一个现实问题:联系人列表有索引值,联系人按拼音首字母归类显示,并能通过首字母很快查找到,简单的说就是跟“手机联系人”的应用是一样的效果。由于是自建数据库,所以这个索引需要自己做,因为在添加联系人的时候必须有索引值。

所谓拼音首字母索引,就是用户名是名字的拼音的对应关系,比如:张三------->zs。或者:张三------>zhangsan

其实只要把汉字转换成拼音了,问题就简单了。就这问题,我在网上找了一个大侠的贴,觉得很不错,就拿来了。原帖地址:http://www.oschina.net/code/snippet_203635_11850

主要难题已被这位大神解决了,我就在这里班门弄斧一下。

就我的问题而言,把新增的联系人制作一个首字母索引,就只要用到文中的三个方法:

   public static String getSpells(String characters){
    	StringBuffer buffer = new StringBuffer();
    	for(int i=0;i<characters.length();i++){
    		
    		char ch = characters.charAt(i);
    		if((ch>>7)==0){
    			//判断是否为汉字,如果左移7为为0就不是汉字,否则是汉字
			return characters;//这句是我自己加的,如果不是汉字,那就返回原字符串,应该没问题吧!
    		}else{
			char spell = getFirstLetter(ch);
			buffer.append(String.valueOf(spell));
    		}
    	}
		return buffer.toString();
    }
    // 获取一个汉字的首字母 
    public static Character getFirstLetter(char ch) { 
         
        byte[] uniCode = null; 
        try { 
            uniCode = String.valueOf(ch).getBytes("GBK"); 
        } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
            return null; 
        } 
        if (uniCode[0] < 128 && uniCode[0] > 0) { // 非汉字 
            return null; 
        } else { 
            return convert(uniCode); 
        } 
    } 
    /**
     * 获取一个汉字的拼音首字母。 GB码两个字节分别减去160,转换成10进制码组合就可以得到区位码
     * 例如汉字“你”的GB码是0xC4/0xE3,分别减去0xA0(160)就是0x24/0x43
     * 0x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为‘n’
     */ 
    static char convert(byte[] bytes) { 
        char result = '-'; 
        int secPosValue = 0; 
        int i; 
        for (i = 0; i < bytes.length; i++) { 
            bytes[i] -= GB_SP_DIFF; 
        } 
        secPosValue = bytes[0] * 100 + bytes[1]; 
        for (i = 0; i < 23; i++) { 
            if (secPosValue >= secPosValueList[i] && secPosValue < secPosValueList[i + 1]) { 
                result = firstLetter[i]; 
                break; 
            } 
        } 
        return result; 
    } 
我们新增联系人时,只需要 sortKey = getSpells(“联系人名字”),把sortKey自己处理一下就可以插入自己的联系人数据库中了,取出来是绝对没错的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值