首页 > java > java中文转拼音

java中文转拼音

2011年7月25日 2,988 views

包括了中文转拼音全拼,及中文转拼音首字母

准备知识:
GB2312编码,采用16位编码方式,简体中文的编码范围从B0A1一直到F7FE。
GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
1)01-09区为特殊符号。
2)16-55区为一级汉字。(常用汉字,按拼音字母/笔形顺序排序,编码始于B0A1,止于D7FE,计3755个)
3)56-87区为二级汉字。(次常用汉字,按部首/笔画顺序排序,编码始于D8A1,止于F7FE,计3008个)
4)10-15区及88-94区则未有编码。

这里,你可以更清晰的了解这些分区。汉字位于16-87区,而有字母排序的汉字位于16-55区,对应编码为B0A1到D7FE。



实现方式
所以,将汉字转换为拼音,基本有两种实现方式:

1.根据GB2312的编码规则,16-55区汉字,是按字母排序的,可以得出某个拼音(全拼)所包含的编码范围(如:zuo对应D7F2-D7F9);这种方式原理简单,只要有一个map(长度大概在400)存放对应的key/value即可,但是这种方式也有一个硬伤就是,对于处在56-87区的汉字完全无能为力。

2.将汉字看做是分布在一个二维表里,由于汉字由两个字节组成,所以,二维表的纵坐标和横坐标,对应编码的高字节和低字节;同时,需要一个包含所有可能拼音(全拼)的数组,以下简称Q数组。如:‘啊’编码是B0A1,即[B0|A1],即[176|161],在二维表的位置就是纵坐标176(纵坐标这里可以做一下偏移量处理),横坐标161,即第176行的第161个汉字,在二维表的[176|161]位置存储了一个索引值(这样做可以节省内存),此索引值即为’啊’对应的拼音全拼在Q数组的序号。更详细一点的可以看这里,这里也给出了Q数组,但是没有发现二维表。这种方式功能没硬伤,就是使用时,资源消耗要大一些。

由于没有找到二维表,下面就只给出第一种方式的java实现:
全部代码有500多行,就不全部列出来了,可以点击下载
下面main方法,给了一些测试

public static void main(String[] args) {
	System.out.println(getPinyin('我'));
	System.out.println(getPinyin("我是一名java开发人员"));
	System.out.println(getPinyin("我是一名java开发人员", false));
	System.out.println(getFirstLetter('中'));
	System.out.println(getFirstLetter("中华人民共和国"));
}

输出:

wo
wo shi yi ming j a v a kai fa ren yuan
woshiyimingjavakaifarenyuan
z
zhrmghg
分类: java 标签:
  1. 本文目前尚无任何评论.