unit PYIndexUnit 汉字-->拼音声母处理

如要收藏此博客请立即按热键 <CTRL> + D

此博客网址 http://www.cnblogs.com/delphixx

我的电子邮箱地址是: [email protected]

联系我邮件标题写上 "博客园" 字样 否则邮件自动删除

我建议像我这样喜欢用AutoHotkey和Delphi编程的年轻人多尝试

多搜搜、多编程、多归类、多收藏、多上传、多刻录、多交流分享

把所有有用的AutoHotkey和Delphi源代码实例等等编程资源都

分类保存到2.5寸移动硬盘中并且上传到360云盘和百度云网盘中

不要到要用的时候乱找乱搜乱试.把编程经验写在《为知笔记》wiz.cn中

同时把绿色免装软件也放到移动硬盘用Total Commander集中管理

< 淘宝包邮 2.5寸 4TB 移动硬盘  、 淘宝包邮DVD刻录光盘 >

unit PYIndexUnit;

{*******************************************************}
{ 汉字-->拼音声母处理 v4.0 }
{ Developed by cyw(QQ: 26890954) }
{ 2013.9.13 All Right Reserved. }
{*******************************************************}

{
一、特点:
1、支持多音字,支持所有中国汉字(共20902个),包括难字、生僻字、广东白话字、繁体字等所有计算机能显示的全部汉字。
例如:镕、啱、揾、叻、嘅、咁、門、長、發財、車、冇乜嘢。
2、同时支持Unicode和ANSI字符集。
3、支持Delphi6至DelphiXE系列的所有Delphi版本(最后一次测试是XE4)。

二、实现原理(Unicode):
1、根据汉字的编码规则,汉字在Unicode的编码范围为$4E00至$9FA5(即:19968至40869, 共20902个汉字)。
2、对中国汉字字库中的每个汉字,扫描从互联网下载的较完整的<GBK汉字各种编码汇总.xls>拼音字库,找到每个汉字的全拼拼音
(包括多音,一个汉字最多4种读音),并获取每个读音的声母(首字母), 生成汉字声母字典文件。
3、把声母字典文件中每个汉字的声母,按汉字字库的Unicode编码规则全部串在一起,由于一个汉字最多3种读音(有4种以上读音的
仅有"竓qfzygs, 竕sfzyg, 竡ygsb"三个生僻字, 仅取前三个读音),为每个汉字预留3个字节空间,生成Unicode汉字声母表,
如本单元所定义的PartUnicode常量。
4、查找原理:要查找一个汉字在声母表中的对应位置,应使用以下公式计算得:
汉字声母索引 = (汉字Unicode编码 - 19968) * 3 + 1; //其中19968是指Unicode字符集中的第一个汉字位置; 3表示每个汉字预留的3个字节空间

三、实现原理(ANSI):
1、根据汉字的编码规则,第一字节为区码(纵向),第二字节为位码(横向),
第一字节的范围是129-254,共126种,其中161-169段存放各种标点符号,254段为无效汉字,真正有效段为129-160,170-253,共116种。
第二字节的范围是64-254,其中127段为分隔符,不存在任何内容,真正有效段为64-126,128-254,共190种。
排除无效字符及标点符号后,有效的汉字库分为三部分:
1)第一部分(区:129-160 位:64-254[除127]) 32*190 =6080
2)第二部分(区:170-253 位:64-160[除127], 区253位156-160留空) 84*96-5=8059
3)第三部分(区:176-247 位:161-254, 区215位250-254留空) 72*94-5=6763
合计: 20902个汉字
2、按以上规则可生成三个部分的中国汉字字库,每个区码一行,每个位码一列。
3、同二(2)。
4、同二(3),如本单元所定义的Part1..Part3常量。
5、查找原理:要查找一个汉字在声母表中的对应位置,应使用以下公式计算得:
汉字声母索引 = ((汉字区码 - 段落起始区码) * 位码长度 + 汉字位码 - 段落起始位码) * 3 + 1; //其中3表示每个汉字预留的3个字节空间
如汉字“啊”,其区位码分别是(176,161),根据上述第1点所定义,属于第三部分汉字,理应在常量Part3中查找,
由于第三部分的位码范围是161-254,横向长度是94,即一行(一个区)有94个汉字,所以“啊”在Part3中的位置应该是:
((176-176) * 94 + 161 - 161) * 3 + 1 = 1,即Part3[1] = ‘a‘;

四、更新历史:
1、10.9.8 由于全拼输入法的拼音库太过全面,有部分多音字的第一个拼音却不是常用的拼音,导致汉字转声母有时不准确,
决定抛弃全拼输入法的拼音库,改为采用从互联网下载的较完整的<GBK汉字各种编码汇总.xls>拼音字库,重新生成汉字声母表。
2、10.12.27 上一次更新时是在Excel中编辑<GBK汉字各种编码汇总.xls>文件的,在Excel内替换右括号")"为空时,"Jun1)"替换后会变成"1-Jun",
Excel的奇怪现象,导致"军"字的声母变成数字"1",类似的情况还有很多。本次更新全面修正此类问题,并且经检测发现99.9%以上的
多音字最多只有三个读音,仅"竓qfzygs, 竕sfzyg, 竡ygsb"三个生僻字有4种以上读音, 故声母表全部由4个字节改为预留3个字节,
上述三个僻字仅截取前三个读音的声母。
3、12.2.14 之前的版本按常用程度分为五个级别,但却漏了(区:170-175 位:64-160)一段汉字,合计漏了6*96=576个汉字未处理。今改为按汉字编码
分布规则,划分为三个部分(三段),共计20902个汉字,是迄今为止史上最完整的汉字字库。据此生成的Part1、Part2、Part3三个声母
常量也是最完整的汉字声母表。另外,从该版本起,开始支持Delphi2007-DelphiXE系列。
4、13.9.13 针对Unicode的编码规则,生成全新的Unicode原生汉字声母表,放弃以前把String转换为AnsiString的方法,由于少了转换步骤,所以理论上
在Delphi2009(或更高版本)时算法速度更优更快。同时使用编译指令兼容Delphi6-2007的非UniCode开发环境,这部分保留以前的算法。
}

interface

uses
SysUtils;

//--------------------------- 声明段 -------------------------------------------

//获取指定汉字的拼音索引字母,如:汉 = h。多音字返回多个声母,如:行 = hx
function GetPYIndex(const OneWord: String; const OnlyOne: Boolean = False): String;
//获取指定字符串的拼音索引字母(多音字总是取第一个音的声母)。如:中山大学 = zsdx
function GetStrPYIndex(const Str: String): String;
//获取字符串Str中与拼音声母字符串PYStr匹配的起始位置。如:PosPY(‘zsdx‘,‘我来自中山大学‘),在Unicode环境中返回4,非Unicode环境返回7
function PosPY(const PYStr, Str: String): Integer;
//判断字符串Str的拼音声母是否全部与PYStr相同。如:SamePY(‘zsdx‘, ‘中山大学‘) = True
function SamePY(const PYStr, Str: String): Boolean;
//获取字符串Str中拼音声母串与字符串SubStr拼音声母串匹配的起始位置。如:PosTextPY(‘纵声大笑‘, ‘我来自中山大学‘),在Unicode环境中返回4,非Unicode环境返回7
function PosTextPY(const SubStr, Str: String): Integer;
//判断字符串Str的拼音声母是否全部与字符串SubStr的拼音声母相同。如:SameTextPY(‘纵声大笑‘, ‘中山大学‘) = True
function SameTextPY(const SubStr, Str: String): Boolean;

//---------------------------- 实现段 ------------------------------------------
implementation

const
MaxPYLength = 3; //最大的拼音声母个数

{$IFDEF UNICODE}
//Unicode汉字声母表 $4E00至$9FA5(即:19968至40869, 共20902个)
PartUnicode =
‘y dz k q s x n wm z s s x j bf y m g c c z qj p s s q b y c d s c d q l d y l y b s s j g y qp z j j f g c c l z zd n w d w z jd l j p f y ya n n j j t my y n z w z h f ly z p p ‘
+‘q h g cs cs y y n mn j q y x x g d n n s n s j n j n s n n m l n r x y f s n gq n n n n qg z gjqg l l y j l n y z s s e c y k y y h q w j s s g g y x y q y jq t w k t j h y c ‘
+‘h m n x j t l h j y q b y x d l d w r r j n w y s r l d z j p cq b z j j b r c f s l n c z s t z f x x c h t r q g gy d d l y c c s s y m m r j c y q z p w w j j y f c r ‘
+‘w f d f z q p y d d w y x k y j a w j f f x j b c f t z y h hk y cz y s w cz c y x s ct l c x x w z c x n b g n n x b x l z s q sc b s jgqp y s a z dt h m d z b q b s c w d z ‘

http://download.csdn.net/detail/cywyes/6296373

时间: 2024-07-29 16:36:47

unit PYIndexUnit 汉字-->拼音声母处理的相关文章

java获取汉字拼音首字母 --转载

在项目中要更能根据某些查询条件(比如姓名)的首字母作为条件进行查询,比如查一个叫"李晓明"的人,可以输入'lxm'.写了一个工具类如下: import java.io.UnsupportedEncodingException; /** * 取得给定汉字串的首字母串,即声母串 * Title: ChineseCharToEn * @date 2004-02-19 注:只支持GB2312字符集中的汉字 */ public final class ChineseCharToEn { priv

C#获取单个字符的拼音声母

public class ConvertToPinYing { /// <summary> /// 汉字转拼音缩写 /// </summary> /// <param name="str">要转换的汉字字符串</param> /// <returns>拼音缩写</returns> public static string GetPYString(string str) { string tempStr = &quo

C/C++ 获取汉字拼音首字母

1 #include <stdint.h> 2 #include <stdio.h> 3 #include <ctype.h> 4 #include <string.h> 5 6 bool between(uint32_t start,uint32_t end,uint32_t aim); 7 char get_first_letter(wchar_t wchar); 8 void get_first_letters(const char *szChines

ios/android获取汉字拼音首字母

android/ios开发如何获取汉字拼音的首字母? 提供的一个比较好的方案,是使用 c语言编写的一个算法,可以 在ios和 android.下面提供一个可以使用的代码,并且附上使用方法: /* * pinyin.c * Chinese Pinyin First Letter * * Created by George on 4/21/10. * Copyright 2010 RED/SAFI. All rights reserved. * */ #define HANZI_START 1996

Java 解析汉字拼音

需要java包 :pinyin4j-2.5.0.jar pinyin4j的使用很方便,一般转换只需要使用PinyinHelper类的静态工具方法即可: String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('赵'); //该类还有其他的拼音转换形式,但是基本上用不到,就不介绍了 返回的数组即是该字符的拼音,如上例就是pinyin[0]=zhao,后面的数字代表声调,声调为5表示轻读,无声调.之所谓返回数组,是因为被判定的汉字有可能有多个读

提取汉字拼音的首字母

这个能取大部分汉字的首字母, 但还不全, 有些UNICODE的汉字是取不到的, 要想取到所有汉字的首字母,最好是能做一个UNICODE汉字和拼音的对照表,通过对照表查. GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个:同时,GB2312收录了包括拉丁字母.希腊字母.日文平假名及片假名字母.俄罗斯语西里尔字母在内的682个全形字符. GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖99.75%的使用频率.GB2312中对所收汉字进行了"分

MySQL数据库获取多个汉字拼音的首字母函数

需求简介:最近的一个项目,想实现如下图所示的显示效果.很明显,如果能够获取对应的汉字词组中每个汉字的拼音首字母就可以实现了,如果是固定的几组汉字,人为的拼一下就可以 了,不过项目中有多处功能需要这个效果,并且事先也不知道对应的汉字是什么,所以就需要一个函数来完成这件事情了,根据网上查询的资料自己改进了一个 函数实现的效果,现分享如下. 1:阅读建议      如果你还没有看过我上一篇博文——MySQL数据库获取汉字拼音的首字母函数,强烈建议请先看一下,因为本篇博文是在她的基础之上写的,相关雷同的

中国省份城市列表(汉字+拼音)

-------------------中国省份和城市列表-------------------------- [ProvinceName] name.1=北京(BeiJing) name.2=上海(ShangHai) name.3=天津(TianJin) name.4=重庆(ChongQing) name.5=香港(XiangGang) name.6=澳门(Aomen) name.7=安徽(AnHui) name.8=福建(FuJian) name.9=广东(GuangDong) name.10

mysql根据汉字拼音排序查询

例如现在有一张数据表label,字段为id.name,此表的字符集设置为gb2312,以gb2312_chinese_ci整理. 设置InnoDB引擎的字符集也为简体中文,且整理为gb2312_chinese_ci. 查询语句如下: select * from label order_by name collate gb2312_chinese_ci; 效果如下: tip:有时候结果不是很准确,不知道是不是因为字符集选择的不当导致的,知道的朋友,请解答下,谢谢! mysql根据汉字拼音排序查询,