Java编程技巧:提取汉字拼音首字母

精贴 置顶
1320 0

 package info.gnuhpc;
  /**
  * @date 2010-1-22
  * @bugs 不支持多音字处理
  */
  public class PinyinConv {
  // 简体中文的编码范围从B0A1(45217)一直到F7FE(63486)
  private static int BEGIN = 45217;
  private static int END = 63486;
  // 按照声 母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。
  // i, u, v都不做声母, 自定规则跟随前面的字母
  private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈',
  '哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌',
  '塌', '挖', '昔', '压', '匝', };
  // 二十六个字母区间对应二十七个端点
  // GB2312码汉字区间十进制表示
  private static int[] table = new int[27];
  // 对应首字母区间表
  private static char[] initialtable = { 'a', 'b', 'c', 'd', 'e', 'f', 'g',
  'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
  't', 't', 'w', 'x', 'y', 'z', };
  // 初始化
  static {
  for (int i = 0; i < 26; i++) {
  table[i] = gbValue(chartable[i]);// 得到GB2312码的首字母区间端点表,十进制。
  }
  table[26] = END;// 区间表结尾
  }

// ------------------------public方法区------------------------
  /**
  * 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法,思路如下:一个个字符读入、判断、输出
  */
  public static String cn2py(String SourceStr) {
  String Result = "";
  int StrLength = SourceStr.length();
  int i;
  try {
  for (i = 0; i < StrLength; i++) {
  Result += Char2Initial(SourceStr.charAt(i));
  }
  } catch (Exception e) {
  Result = "";
  }
  return Result;
  }
  // ------------------------private方法区------------------------
  /**
  * 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0'
  *
  */
  private static char Char2Initial(char ch) {
  // 对英文字母的处理:小写字母转换为大写,大写的直接返回
  if (ch >= 'a' && ch <= 'z')
  return (char) (ch - 'a' + 'A');
  if (ch >= 'A' && ch <= 'Z')
  return ch;
  // 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内,
  // 若不是,则直接返回。
  // 若是,则在码表内的进行判断。
  int gb = gbValue(ch);// 汉字转换首字母
  if ((gb < BEGIN) || (gb > END))// 在码表区间之前,直接返回
  return ch;
  int i;
  for (i = 0; i < 26; i++) {// 判断匹配码表区间,匹配到就break,判断区间形如“[,)”
  if ((gb >= table[i]) && (gb < table[i+1]))
  break;
  }
  if (gb==END) {//补上GB2312区间最右端
  i=25;
  }
  return initialtable[i]; // 在码表区间中,返回首字母
  }
  /**
  * 取出汉字的编码 cn 汉字
  */
  private static int gbValue(char ch) {// 将一个汉字(GB2312)转换为十进制表示。
  String str = new String();
  str += ch;
  try {
  byte[] bytes = str.getBytes("GB2312");
  if (bytes.length < 2)
  return 0;
  return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
  } catch (Exception e) {
  return 0;
  }
  }
  public static void main(String[] args) throws Exception {
  System.out.println(cn2py("重庆重视发展IT行业,大多数外企,如,IBM等进驻山城"));
  }
  }

  • 没有任何评论
今日天气 ···

···

···

···

热门排行
CSS cursor鼠标样式一览表 2012-06-25
.NET后台写JS代码 2011-11-03
网站地址多出jdfwkey的问题解析及... 2010-08-25
数据库xxx的日志已满,请备份该数... 2013-07-19
百度、google、Yahoo网站地图制作... 2011-01-30
<a>标签的伪类书写顺序问题... 2010-09-04
什么是长尾关键词? 2010-09-24
CEO名言 2010-08-31
Mysql 主从数据库同步 2010-09-12
用ASP实现网页BBS 2010-11-01
博主推荐
本个人博客微信公众平台上线啦~~... 2013-10-13
饼哥网络互联上线啦~~要买域名空... 2013-09-20
网站title标题如何正确修改不会被... 2013-08-26
饼哥通讯录系统上线啦,欢迎大家... 2013-08-24
ASP .NET MYSQL 的简单分页 并不... 2013-08-19
网站有弹窗广告这样的站点,百度... 2013-08-17
做淘宝SEO优化需要注意的8大问题 2013-08-17
淘宝网怎么做SEO优化 2013-08-17
站长们要学习的“苍井空精神” 2013-08-17
苹果公司今日发布了iOS 7第五个开... 2013-08-07
随便看看
Java语言将淡出 JVM宝座争夺战预... 2013-06-26
CEO名言 2010-08-31
怎么看关键词优化得好不好? 2010-09-19
如何在.NET中访问MySQL数据库 2010-09-10
SQL2000函数总结 2011-07-02
什么是绝对地址和相对地址? 2010-09-25
.net2.0邮件发送代码 2010-09-11
HTML5下插入flash 2013-10-03
win7系统局域网共享设置解决方案 2013-07-29
关于如何保障Winnt+asp+sql的web... 2010-10-23
RSS新闻
传媒新闻
CSDN
八卦新闻
女性新闻
台湾新闻
互联网
军事-新浪博客
IT-新浪博客
汽车新闻
游戏新闻
国际新闻
国内新闻
体育新闻
我的微博
北京 上海 杭州 深圳 广州 成都