获得一段汉字中每个汉字的第一个拼音字母

/**GB   2312-80   把收录的汉字分成两级。第一级汉字是常用汉字,计   3755   个,     
  *   置于   16~55   区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字,     
  *   计   3008   个,置于   56~87   区,按部首/笔画顺序排列,所以本程序只能查到   
  *   对一级汉字的声母。同时对符合声母(zh,ch,sh)只能取首字母(z,c,s)   
  
*/
   
    
  
public     class    StringUtil    {   
    
  
private   static   Log   logger   =   LogFactory.getLog(StringUtil.class);   
    
  
//   国标码和区位码转换常量   
  static   final   int   GB_SP_DIFF   =   160;   
  
//存放国标一级汉字不同读音的起始区位码   
  static   final   int[]   secPosvalueList   =   {   
  
1601,   1637,   1833,   2078,   2274,   2302,   2433,   2594,   2787,   
  
3106,   3212,   3472,   3635,   3722,   3730,   3858,   4027,   4086,   
  
4390,   4558,   4684,   4925,   5249,   5600}
;   
    
  
//存放国标一级汉字不同读音的起始区位码对应读音   
  static   final   char[]   firstLetter   =   {   
  
'a',   'b',   'c',   'd',   'e',   'f',   'g',   'h',   'j',   
  
'k',   'l',   'm',   'n',   'o',   'p',   'q',   'r',   's',   
  
't',   'w',   'x',   'y',   'z'}
;   
    
  
//获取一个字符串的拼音码   
  public   static   String   getFirstLetter(String   oriStr)   {   
  String   str   
=   oriStr.toLowerCase();   
  StringBuffer   buffer   
=   new   StringBuffer();   
  
char   ch;   
  
char[]   temp;   
  
for   (int   i   =   0;   i   <   str.length();   i++)   {   //依次处理str中每个字符   
  ch   =   str.charAt(i);   
  temp   
=   new   char[]   {ch};   
  
byte[]   uniCode   =   new   String(temp).getBytes();   
  
if   (uniCode[0]   <   128   &&   uniCode[0]   >   0)   {   //   非汉字   
  buffer.append(temp);   
  }
   else   {   
  buffer.append(convert(uniCode));   
  }
   
  }
   
  
return   buffer.toString();   
  }
   
    
  
/**   获取一个汉字的拼音首字母。   
  *   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;   
  }
   
  
public   static   void   main(String[]   args)   {   
  System.out.println(StringUtil.getFirstLetter(
"I   love   u"));   
  System.out.println(StringUtil.getFirstLetter(
"我爱北京天安门"));   
  System.out.println(StringUtil.getFirstLetter(
"I   love   北京天安门"));   
  }
   
  }
   

运行输出:  
  i   love   u  
  wabjtam  
  i   love   bjtam

在项目中要更能根据某些查询条件(比如姓名)的首字母作为条件进行查询,比如查一个叫“张三”的人,可以输入‘zs'。写了上面的工具类。还可以做为CMS自动发布程序使用。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值