获取汉字拼音首字母

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

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

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

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

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

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

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本身处理一下就能够插入本身的联系人数据库中了,取出来是绝对没错的。