基础知识
GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个。
分区表示
GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
1)01-09区为特殊符号。
2)16-55区为一级汉字,按拼音排序。
3)56-87区为二级汉字,按部首/笔画排序。
4)10-15区及88-94区则未有编码。
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
字节结构
在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上 0xA0)。由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE。
例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节) 0xA1(第二个字节)储存。区位码=区字节+位字节(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
GB2312编码表
16 0 1 2 3 4 5 6 7 8 9
0 啊 阿 埃 挨 哎 唉 哀 皑 癌
1 蔼 矮 艾 碍 爱 隘 鞍 氨 安 俺
2 按 暗 岸 胺 案 肮 昂 盎 凹 敖
3 熬 翱 袄 傲 奥 懊 澳 芭 捌 扒
4 叭 吧 笆 八 疤 巴 拔 跋 靶 把
5 耙 坝 霸 罢 爸 白 柏 百 摆 佰
6 败 拜 稗 斑 班 搬 扳 般 颁 板
7 版 扮 拌 伴 瓣 半 办 绊 邦 帮
8 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤
9 苞 胞 包 褒 剥
17 0 1 2 3 4 5 6 7 8 9
0 薄 雹 保 堡 饱 宝 抱 报 暴
1 豹 鲍 爆 杯 碑 悲 卑 北 辈 背
2 贝 钡 倍 狈 备 惫 焙 被 奔 苯
3 本 笨 崩 绷 甭 泵 蹦 迸 逼 鼻
4 比 鄙 笔 彼 碧 蓖 蔽 毕 毙 毖
5 币 庇 痹 闭 敝 弊 必 辟 壁 臂
6 避 陛 鞭 边 编 贬 扁 便 变 卞
7 辨 辩 辫 遍 标 彪 膘 表 鳖 憋
8 别 瘪 彬 斌 濒 滨 宾 摈 兵 冰
9 柄 丙 秉 饼 炳
18 0 1 2 3 4 5 6 7 8 9
0 病 并 玻 菠 播 拨 钵 波 博
1 勃 搏 铂 箔 伯 帛 舶 脖 膊 渤
2 泊 驳 捕 卜 哺 补 埠 不 布 步
3 簿 部 怖 擦 猜 裁 材 才 财 睬
4 踩 采 彩 菜 蔡 餐 参 蚕 残 惭
5 惨 灿 苍 舱 仓 沧 藏 操 糙 槽
6 曹 草 厕 策 侧 册 测 层 蹭 插
7 叉 茬 茶 查 碴 搽 察 岔 差 诧
8 拆 柴 豺 搀 掺 蝉 馋 谗 缠 铲
9 产 阐 颤 昌 猖
根据上面的表述,我们可以把16-55区的一级汉字,取拼音首之母了。
首先找出不同拼音首之母,且在码表中位置最靠前的汉字,计算出它们的编码值。
(GB2312完整码表http://210.44.195.12/yyx/chinese/News/UploadFile/GB2312.htm)
其他汉字在相同编码下,只需计算出其所在的区间位置。
1. 判断是否为英文之母
2. 如果是,直接返回英文之母
3. 取字符的编码值
4. 比较判断其编码值在码表中的位置。
5. 根据位置值,返回之母表中相应值。
// 字母Z使用了两个标签,这里有27个值 ('座'之后的汉字是二级汉字,按部首/笔画排序)
// i, u, v都不做声母, 跟随前面的字母
private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发',
'噶', '哈', '哈', '击', '喀', '垃', '妈', '拿',
'哦', '啪', '期', '然', '撒', '塌', '塌', '塌',
'挖', '昔', '压', '匝', '座' };
private static int[] table = new int[27];
// 初始化,GB2312编码值
static {
for (int i = 0; i < 27; ++i) {
table[i] = gbValue(chartable[i]);
}
}
// 取出汉字的编码
private static int gbValue(char ch) {
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;
}
}
这种方法能力有限,只可以识别一级汉字,对二级汉字就无法识别。
附上代码:
// 字母Z使用了两个标签,这里有27个值
// i, u, v都不做声母, 跟随前面的字母
private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发',
'噶', '哈', '哈', '击', '喀', '垃', '妈', '拿',
'哦', '啪', '期', '然', '撒', '塌', '塌',
'塌', '挖', '昔', '压', '匝', '座' };
public static final char[] firstLetter = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
private static int[] table = new int[27];
// 初始化
static {
for (int i = 0; i < 27; ++i) {
table[i] = gbValue(chartable[i]);
}
}
// 主函数,输入字符,得到他的声母,
// 英文字母返回对应的大写字母
// 其他非简体汉字返回 '0'
public static char char2Alpha(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 < table[0]) return '0';
int i;
for (i = 0; i < 26; ++i) {
if (match(i, gb)) break;
}
if (i >= 26) return '0';
else return firstLetter[i];
}
// 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串
public static String string2Alpha(String SourceStr) {
String Result = "";
int StrLength = SourceStr.length();
int i;
try {
for (i = 0; i < StrLength; i++) {
Result += char2Alpha(SourceStr.charAt(i));
}
} catch (Exception e) {
Result = "";
}
return Result;
}
// 获取一个字符串的拼音码大写
public static String getFirstWordFirstLetter(String SourceStr) {
String Result = "*";
try {
Result = String.valueOf(char2Alpha(SourceStr.charAt(0)));
} catch (Exception e) {
Result = "*";
}
return Result;
}
private static boolean match(int i, int gb) {
if (gb < table[i]) return false;
int j = i + 1;
// 字母Z使用了两个标签
while (j < 26 && (table[j] == table[i]))
++j;
if (j == 26) return gb <= table[j];
else return gb < table[j];
}
// 取出汉字的编码
private static int gbValue(char ch) {
String str = new String();
str += ch;
try {
byte[] bytes = str.getBytes("GBK");
if (bytes.length < 2) return 0;
return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
} catch (Exception e) {
return 0;
}
}
分享到:
相关推荐
Oracle查询取汉字拼音首字母Function
SQL取得汉字拼音首字母SQL取得汉字拼音首字母SQL取得汉字拼音首字母SQL取得汉字拼音首字母SQL取得汉字拼音首字母
取汉字拼音首字母的自定义EXCEL函数.取汉字拼音首字母的自定义EXCEL函数.
标题和描述中提到的“取汉字拼音首字母的函数”就是这样的一个功能,它能够帮助开发者快速地获取汉字串对应的拼音首字母。这种函数通常在中文文本处理的场景下被广泛应用。 首先,我们要理解汉字到拼音转换的基本...
SQL取汉字拼音首字母的存储过程。对于查询汉字的很方便,不用输汉字,输入汉字拼音首字母就OK了。
在本项目"Qt提取汉字拼音首字母"中,我们将探讨如何利用Qt来处理汉字与拼音之间的转换,特别是在获取汉字的拼音首字母方面。 首先,我们需要理解汉字与拼音的关系。汉字是中文的主要书写系统,而拼音是用拉丁字母来...
今天,我们要探讨的是一款“取汉字拼音首字母工具”的源码,其提供了将汉字准确转换成对应的拼音首字母的功能。尽管它是用Delphi语言编写的,但其设计原理和算法逻辑对其他编程语言也有重要的借鉴意义。 Delphi是...
java提取汉字拼音首字母的代码,简体中文的编码范围从B0A1(45217)一直到F7FE(63486),不支持多音字处理
### C#获取汉字拼音首字母的原理 在计算机科学中,汉字的编码通常使用Unicode标准,该标准为每一个字符分配了一个唯一的数字编码。对于汉字来说,其Unicode编码范围远超ASCII字符集,这使得我们可以通过分析Unicode...
这篇关于"C#取汉字拼音首字母DEMO,支持多音字"的主题,涉及到的是使用C#编程语言来实现一个功能,该功能能够从汉字中提取出拼音的首字母,并且能够处理多音字的情况。这对于开发一些基于汉字的搜索、排序或者信息...
在给定的"取汉字拼音首字母的Demo"中,开发者可能遇到了这样的需求:用户界面显示一个ListView,其中的数据需要按照每个条目标题的汉字拼音首字母进行排序。这种功能常见于电话簿应用或者任何需要快速查找的列表。 ...
### Java 实现提取汉语字符串各汉字拼音首字母并大写 在Java中实现提取汉语字符串各汉字拼音首字母并将其转换为大写是一项常见的需求,尤其是在处理中文文本数据时。本篇文章将详细介绍如何通过Java代码来实现这一...
标题中的“PB获取汉字拼音首字母”指的是使用PowerBuilder(PB)编程语言编写的一个功能,该功能能够提取汉字的拼音首字母,特别是汉字拼音的声母部分。在中文信息处理中,有时候我们需要将汉字转化为拼音表示,特别...
### Excel中取汉字拼音首字母:VBA函数详解 在处理中文数据时,有时我们需要将汉字转换为其拼音的首字母,这在数据整理、排序或创建缩写时尤为有用。Excel本身并不直接支持这种功能,但通过VBA(Visual Basic for ...
从给定的文件信息来看,主要讨论的是一个用于获取每个汉字拼音首字母的函数实现。这一功能在中文信息处理、中文姓名缩写生成、中文文本分析等领域有着广泛的应用。下面,我们将深入探讨这一主题,包括拼音首字母的...
“自动取拼音”很可能是一个源代码文件或者函数库,提供具体的实现方法,程序员可以引用或修改这部分代码以满足自己的需求。 在实际应用中,实现这个功能可能包括以下几个步骤: 1. 导入必要的库或API。 2. 编写...
首先,我们需要理解汉字拼音首码的基本原理。汉字拼音首码通常基于汉字的普通话拼音,取每个汉字拼音的首字母,如果首字母相同,则可能取第二个或第三个字母,直到形成一个唯一的编码。例如,“程序”在拼音中是“ch...
首先,我们要理解汉字拼音转换的基本原理。在中文处理中,我们需要将汉字转化为拼音,以便计算机可以进行进一步的分析和操作。这通常通过查找汉字到拼音的映射表来实现。在提供的压缩包中,`pinyin.txt`文件很可能...
本项目聚焦于实现一个功能,即将汉字转换为它们的拼音首字母,这对于信息检索、文本处理或创建搜索引擎等应用非常有用。下面将详细介绍这个功能的实现原理以及涉及到的相关知识点。 1. **汉字转拼音**: 在Delphi...
PB 提取汉字拼音首字母的功能是开发者在处理中文字符时可能会遇到的需求,尤其是在数据处理、搜索优化或者构建中文索引等方面。这个功能允许将汉字转换为其对应的拼音首字母,从而实现基于拼音的快速查找或排序。 ...