admin 管理员组

文章数量: 893601

DELPHI关于汉字转拼音的一些想法

不大习惯c笔记的发文模式。就是想在这里简单的记录一下自己的学习心得。
关于汉字转拼音,各有各的模式。我在网上找了一些,也看了其他编程软件做的一些代码,很有启发性。但作为想将Delphi作为自己主修的一个菜鸟,还是想将Delphi下的给完善好。
Delphi中将汉字的首字母提取出来的代码很多,但能将全拼完全提取出来的,且代码好理解的不多。我学到这一段,便开始网上查资料,多多的了解到汉字的编码其实很多种,有大字符集、国标2312,utf-8,16以及其他几种。
我们最多用的是ord()提取一个十进制的ASCII码,但这个ASCII的排序与拼音的排序很杂乱。按照拼音编码的是一种大字符集,获取得到的是机内码。我不知道为什么很多的程序语言得到的十进制机内码都是负数,说是16进制的补足进1,这一点有点糊涂,一直没弄懂,但是通过看资料知道了机内码才是和拼音有序的结合的。
从网上抄下了一段代码,是我在Delphi11下改写的。
//获取汉字的机内码,不同于ASCII码和十进制码
Function Chinese2MacCode(AiChinese : ansiString) : Integer;
Var
ch, cl : Integer;
Begin
ch := Ord(AiChinese[1]);
cl := Ord(AiChinese[2]);
Result := (ch shl 8) + cl;
end;
//转为拼音函数
function TFpy(s: ansistring): string;
var
ascH, strAsc: Integer;
pinyin:string;
begin
ascH:=Chinese2MacCode(s) ;
strAsc:=asch-65535; //在这里减去256的平方得到的是负数,原来获得的机内码并不是负数。
case strAsc of
-20319 … -20318: pinyin := ‘a’;
-20317 … -20305: pinyin := ‘ai’;
-20304 … -20296: pinyin := ‘an’;
-20295 … -20293: pinyin := ‘ang’;
-20292 … -20284: pinyin := ‘ao’;
-20283 … -20266: pinyin := ‘ba’;
-20265 … -20258: pinyin := ‘bai’;
-20257 … -20243: pinyin := ‘ban’;
-20242 … -20231: pinyin := ‘bang’;
-20230 … -20052: pinyin := ‘bao’;
-20051 … -20037: pinyin := ‘bei’;
-20036 … -20033: pinyin := ‘ben’;
-20032 … -20027: pinyin := ‘beng’;
-20026 … -20003: pinyin := ‘bi’;
-20002 … -19991: pinyin := ‘bian’;
-19990 … -19987: pinyin := ‘biao’;
-19986 … -19983: pinyin := ‘bie’;
-19982 … -19977: pinyin := ‘bin’;
-19976 … -19806: pinyin := ‘bing’;
-19805 … -19785: pinyin := ‘bo’;
-19784 … -19776: pinyin := ‘bu’;
-19775 … -19775: pinyin := ‘ca’;
-19774 … -19764: pinyin := ‘cai’;
-19763 … -19757: pinyin := ‘can’;
-19756 … -19752: pinyin := ‘cang’;
-19751 … -19747: pinyin := ‘cao’;
-19746 … -19742: pinyin := ‘ce’;
-19741 … -19740: pinyin := ‘ceng’;
-19739 … -19729: pinyin := ‘cha’;
-19728 … -19726: pinyin := ‘chai’;
-19725 … -19716: pinyin := ‘chan’;
-19715 … -19541: pinyin := ‘chang’;
-19540 … -19532: pinyin := ‘chao’;
-19531 … -19526: pinyin := ‘che’;
-19525 … -19516: pinyin := ‘chen’;
-19515 … -19501: pinyin := ‘cheng’;
-19500 … -19485: pinyin := ‘chi’;
-19484 … -19480: pinyin := ‘chong’;
-19479 … -19468: pinyin := ‘chou’;
-19467 … -19290: pinyin := ‘chu’;
-19289 … -19289: pinyin := ‘chuai’;
-19288 … -19282: pinyin := ‘chuan’;
-19281 … -19276: pinyin := ‘chuang’;
-19275 … -19271: pinyin := ‘chui’;
-19270 … -19264: pinyin := ‘chun’;
-19263 … -19262: pinyin := ‘chuo’;
-19261 … -19250: pinyin := ‘ci’;
-19249 … -19244: pinyin := ‘cong’;
-19243 … -19243: pinyin := ‘cou’;
-19242 … -19239: pinyin := ‘cu’;
-19238 … -19236: pinyin := ‘cuan’;
-19235 … -19228: pinyin := ‘cui’;
-19227 … -19225: pinyin := ‘cun’;
-19224 … -19219: pinyin := ‘cuo’;
-19218 … -19213: pinyin := ‘da’;
-19212 … -19039: pinyin := ‘dai’;
-19038 … -19024: pinyin := ‘dan’;
-19023 … -19019: pinyin := ‘dang’;
-19018 … -19007: pinyin := ‘dao’;
-19006 … -19004: pinyin := ‘de’;
-19003 … -18997: pinyin := ‘deng’;
-18996 … -18978: pinyin := ‘di’;
-18977 … -18962: pinyin := ‘dian’;
-18961 … -18953: pinyin := ‘diao’;
-18952 … -18784: pinyin := ‘die’;
-18783 … -18775: pinyin := ‘ding’;
-18774 … -18774: pinyin := ‘diu’;
-18773 … -18527: pinyin := ‘dong’;
-18526 … -18519: pinyin := ‘fa’;
-18518 … -18502: pinyin := ‘fan’;
-18501 … -18491: pinyin := ‘fang’;
-18490 … -18479: pinyin := ‘fei’;
-18478 … -18464: pinyin := ‘fen’;
-18463 … -18449: pinyin := ‘feng’;
-18448 … -18448: pinyin := ‘fo’;
-18447 … -18447: pinyin := ‘fou’;
-18446 … -18240: pinyin := ‘fu’;
-18239 … -18238: pinyin := ‘ga’;
-18237 … -18232: pinyin := ‘gai’;
-18231 … -18221: pinyin := ‘gan’;
-18220 … -18212: pinyin := ‘gang’;
-18211 … -18202: pinyin := ‘gao’;
-18201 … -18185: pinyin := ‘ge’;
-18184 … -18184: pinyin := ‘gei’;
-18183 … -18182: pinyin := ‘gen’;
-18181 … -18013: pinyin := ‘geng’;
-18012 … -17998: pinyin := ‘gong’;
-17997 … -17989: pinyin := ‘gou’;
-17988 … -17971: pinyin := ‘gu’;
-17970 … -17965: pinyin := ‘gua’;
-17964 … -17962: pinyin := ‘guai’;
-17961 … -17951: pinyin := ‘guan’;
-17950 … -17948: pinyin := ‘guang’;
-17947 … -17932: pinyin := ‘gui’;
-17931 … -17929: pinyin := ‘gun’;
-17928 … -17923: pinyin := ‘guo’;
-17922 … -17760: pinyin := ‘ha’;
-17759 … -17753: pinyin := ‘hai’;
-17752 … -17734: pinyin := ‘han’;
-17733 … -17731: pinyin := ‘hang’;
-17730 … -17722: pinyin := ‘hao’;
-17721 … -17704: pinyin := ‘he’;
-17703 … -17702: pinyin := ‘hei’;
-17701 … -17698: pinyin := ‘hen’;
-17697 … -17693: pinyin := ‘heng’;
-17692 … -17684: pinyin := ‘hong’;
-17683 … -17677: pinyin := ‘hou’;
-17676 … -17497: pinyin := ‘hu’;
-17496 … -17488: pinyin := ‘hua’;
-17487 … -17483: pinyin := ‘huai’;
-17482 … -17469: pinyin := ‘huan’;
-17468 … -17455: pinyin := ‘huang’;
-17454 … -17434: pinyin := ‘hui’;
-17433 … -17428: pinyin := ‘hun’;
-17427 … -17418: pinyin := ‘huo’;
-17417 … -17203: pinyin := ‘ji’;
-17202 … -17186: pinyin := ‘jia’;
-17185 … -16984: pinyin := ‘jian’;
-16983 … -16971: pinyin := ‘jiang’;
-16970 … -16943: pinyin := ‘jiao’;
-16942 … -16916: pinyin := ‘jie’;
-16915 … -16734: pinyin := ‘jin’;
-16733 … -16709: pinyin := ‘jing’;
-16708 … -16707: pinyin := ‘jiong’;
-16706 … -16690: pinyin := ‘jiu’;
-16689 … -16665: pinyin := ‘ju’;
-16664 … -16658: pinyin := ‘juan’;
-16657 … -16648: pinyin := ‘jue’;
-16647 … -16475: pinyin := ‘jun’;
-16474 … -16471: pinyin := ‘ka’;
-16470 … -16466: pinyin := ‘kai’;
-16465 … -16460: pinyin := ‘kan’;
-16459 … -16453: pinyin := ‘kang’;
-16452 … -16449: pinyin := ‘kao’;
-16448 … -16434: pinyin := ‘ke’;
-16433 … -16430: pinyin := ‘ken’;
-16429 … -16428: pinyin := ‘keng’;
-16427 … -16424: pinyin := ‘kong’;
-16423 … -16420: pinyin := ‘kou’;
-16419 … -16413: pinyin := ‘ku’;
-16412 … -16408: pinyin := ‘kua’;
-16407 … -16404: pinyin := ‘kuai’;
-16403 … -16402: pinyin := ‘kuan’;
-16401 … -16394: pinyin := ‘kuang’;
-16393 … -16221: pinyin := ‘kui’;
-16220 … -16217: pinyin := ‘kun’;
-16216 … -16213: pinyin := ‘kuo’;
-16212 … -16206: pinyin := ‘la’;
-16205 … -16203: pinyin := ‘lai’;
-16202 … -16188: pinyin := ‘lan’;
-16187 … -16181: pinyin := ‘lang’;
-16180 … -16172: pinyin := ‘lao’;
-16171 … -16170: pinyin := ‘le’;
-16169 … -16159: pinyin := ‘lei’;
-16158 … -16156: pinyin := ‘leng’;
-16155 … -15960: pinyin := ‘li’;
-15959 … -15959: pinyin := ‘lia’;
-15958 … -15945: pinyin := ‘lian’;
-15944 … -15934: pinyin := ‘liang’;
-15933 … -15921: pinyin := ‘liao’;
-15920 … -15916: pinyin := ‘lie’;
-15915 … -15904: pinyin := ‘lin’;
-15903 … -15890: pinyin := ‘ling’;
-15889 … -15879: pinyin := ‘liu’;
-15878 … -15708: pinyin := ‘long’;
-15707 … -15702: pinyin := ‘lou’;
-15701 … -15682: pinyin := ‘lu’;
-15681 … -15668: pinyin := ‘lv’;
-15667 … -15662: pinyin := ‘luan’;
-15661 … -15660: pinyin := ‘lue’;
-15659 … -15653: pinyin := ‘lun’;
-15652 … -15641: pinyin := ‘luo’;
-15640 … -15632: pinyin := ‘ma’;
-15631 … -15626: pinyin := ‘mai’;
-15625 … -15455: pinyin := ‘man’;
-15454 … -15449: pinyin := ‘mang’;
-15448 … -15437: pinyin := ‘mao’;
-15436 … -15436: pinyin := ‘me’;
-15435 … -15420: pinyin := ‘mei’;
-15419 … -15417: pinyin := ‘men’;
-15416 … -15409: pinyin := ‘meng’;
-15408 … -15395: pinyin := ‘mi’;
-15394 … -15386: pinyin := ‘mian’;
-15385 … -15378: pinyin := ‘miao’;
-15377 … -15376: pinyin := ‘mie’;
-15375 … -15370: pinyin := ‘min’;
-15369 … -15364: pinyin := ‘ming’;
-15363 … -15363: pinyin := ‘miu’;
-15362 … -15184: pinyin := ‘mo’;
-15183 … -15181: pinyin := ‘mou’;
-15180 … -15166: pinyin := ‘mu’;
-15165 … -15159: pinyin := ‘na’;
-15158 … -15154: pinyin := ‘nai’;
-15153 … -15151: pinyin := ‘nan’;
-15150 … -15150: pinyin := ‘nang’;
-15149 … -15145: pinyin := ‘nao’;
-15144 … -15144: pinyin := ‘ne’;
-15143 … -15142: pinyin := ‘nei’;
-15141 … -15141: pinyin := ‘nen’;
-15140 … -15140: pinyin := ‘neng’;
-15139 … -15129: pinyin := ‘ni’;
-15128 … -15122: pinyin := ‘nian’;
-15121 … -15120: pinyin := ‘niang’;
-15119 … -15118: pinyin := ‘niao’;
-15117 … -15111: pinyin := ‘nie’;
-15110 … -15110: pinyin := ‘nin’;
-15109 … -14942: pinyin := ‘ning’;
-14941 … -14938: pinyin := ‘niu’;
-14937 … -14934: pinyin := ‘nong’;
-14933 … -14931: pinyin := ‘nu’;
-14930 … -14930: pinyin := ‘nv’;
-14929 … -14929: pinyin := ‘nuan’;
-14928 … -14927: pinyin := ‘nue’;
-14926 … -14923: pinyin := ‘nuo’;
-14922 … -14922: pinyin := ‘o’;
-14921 … -14915: pinyin := ‘ou’;
-14914 … -14909: pinyin := ‘pa’;
-14908 … -14903: pinyin := ‘pai’;
-14902 … -14895: pinyin := ‘pan’;
-14894 … -14890: pinyin := ‘pang’;
-14889 … -14883: pinyin := ‘pao’;
-14882 … -14874: pinyin := ‘pei’;
-14873 … -14872: pinyin := ‘pen’;
-14871 … -14858: pinyin := ‘peng’;
-14857 … -14679: pinyin := ‘pi’;
-14678 … -14675: pinyin := ‘pian’;
-14674 … -14671: pinyin := ‘piao’;
-14670 … -14669: pinyin := ‘pie’;
-14668 … -14664: pinyin := ‘pin’;
-14663 … -14655: pinyin := ‘ping’;
-14654 … -14646: pinyin := ‘po’;
-14645 … -14631: pinyin := ‘pu’;
-14630 … -14595: pinyin := ‘qi’;
-14594 … -14430: pinyin := ‘qia’;
-14429 … -14408: pinyin := ‘qian’;
-14407 … -14400: pinyin := ‘qiang’;
-14399 … -14385: pinyin := ‘qiao’;
-14384 … -14380: pinyin := ‘qie’;
-14379 … -14369: pinyin := ‘qin’;
-14368 … -14356: pinyin := ‘qing’;
-14355 … -14354: pinyin := ‘qiong’;
-14353 … -14346: pinyin := ‘qiu’;
-14345 … -14171: pinyin := ‘qu’;
-14170 … -14160: pinyin := ‘quan’;
-14159 … -14152: pinyin := ‘que’;
-14151 … -14150: pinyin := ‘qun’;
-14149 … -14146: pinyin := ‘ran’;
-14145 … -14141: pinyin := ‘rang’;
-14140 … -14138: pinyin := ‘rao’;
-14137 … -14136: pinyin := ‘re’;
-14135 … -14126: pinyin := ‘ren’;
-14125 … -14124: pinyin := ‘reng’;
-14123 … -14123: pinyin := ‘ri’;
-14122 … -14113: pinyin := ‘rong’;
-14112 … -14110: pinyin := ‘rou’;
-14109 … -14100: pinyin := ‘ru’;
-14099 … -14098: pinyin := ‘ruan’;
-14097 … -14095: pinyin := ‘rui’;
-14094 … -14093: pinyin := ‘run’;
-14092 … -14091: pinyin := ‘ruo’;
-14090 … -14088: pinyin := ‘sa’;
-14087 … -14084: pinyin := ‘sai’;
-14083 … -13918: pinyin := ‘san’;
-13917 … -13915: pinyin := ‘sang’;
-13914 … -13911: pinyin := ‘sao’;
-13910 … -13908: pinyin := ‘se’;
-13907 … -13907: pinyin := ‘sen’;
-13906 … -13906: pinyin := ‘seng’;
-13905 … -13897: pinyin := ‘sha’;
-13896 … -13895: pinyin := ‘shai’;
-13894 … -13879: pinyin := ‘shan’;
-13878 … -13871: pinyin := ‘shang’;
-13870 … -13860: pinyin := ‘shao’;
-13859 … -13848: pinyin := ‘she’;
-13847 … -13832: pinyin := ‘shen’;
-13831 … -13659: pinyin := ‘sheng’;
-13658 … -13612: pinyin := ‘shi’;
-13611 … -13602: pinyin := ‘shou’;
-13601 … -13407: pinyin := ‘shu’;
-13406 … -13405: pinyin := ‘shua’;
-13404 … -13401: pinyin := ‘shuai’;
-13400 … -13399: pinyin := ‘shuan’;
-13398 … -13396: pinyin := ‘shuang’;
-13395 … -13392: pinyin := ‘shui’;
-13391 … -13388: pinyin := ‘shun’;
-13387 … -13384: pinyin := ‘shuo’;
-13383 … -13368: pinyin := ‘si’;
-13367 … -13360: pinyin := ‘song’;
-13359 … -13357: pinyin := ‘sou’;
-13356 … -13344: pinyin := ‘su’;
-13343 … -13341: pinyin := ‘suan’;
-13340 … -13330: pinyin := ‘sui’;
-13329 … -13327: pinyin := ‘sun’;
-13326 … -13319: pinyin := ‘suo’;
-13318 … -13148: pinyin := ‘ta’;
-13147 … -13139: pinyin := ‘tai’;
-13138 … -13121: pinyin := ‘tan’;
-13120 … -13108: pinyin := ‘tang’;
-13107 … -13097: pinyin := ‘tao’;
-13096 … -13096: pinyin := ‘te’;
-13095 … -13092: pinyin := ‘teng’;
-13091 … -13077: pinyin := ‘ti’;
-13076 … -13069: pinyin := ‘tian’;
-13068 … -13064: pinyin := ‘tiao’;
-13063 … -13061: pinyin := ‘tie’;
-13060 … -12889: pinyin := ‘ting’;
-12888 … -12876: pinyin := ‘tong’;
-12875 … -12872: pinyin := ‘tou’;
-12871 … -12861: pinyin := ‘tu’;
-12860 … -12859: pinyin := ‘tuan’;
-12858 … -12853: pinyin := ‘tui’;
-12852 … -12850: pinyin := ‘tun’;
-12849 … -12839: pinyin := ‘tuo’;
-12838 … -12832: pinyin := ‘wa’;
-12831 … -12830: pinyin := ‘wai’;
-12829 … -12813: pinyin := ‘wan’;
-12812 … -12803: pinyin := ‘wang’;
-12802 … -12608: pinyin := ‘wei’;
-12607 … -12598: pinyin := ‘wen’;
-12597 … -12595: pinyin := ‘weng’;
-12594 … -12586: pinyin := ‘wo’;
-12585 … -12557: pinyin := ‘wu’;
-12556 … -12360: pinyin := ‘xi’;
-12359 … -12347: pinyin := ‘xia’;
-12346 … -12321: pinyin := ‘xian’;
-12320 … -12301: pinyin := ‘xiang’;
-12300 … -12121: pinyin := ‘xiao’;
-12120 … -12100: pinyin := ‘xie’;
-12099 … -12090: pinyin := ‘xin’;
-12089 … -12075: pinyin := ‘xing’ ;
-12074 … -12068: pinyin := ‘xiong’;
-12067 … -12059: pinyin := ‘xiu’;
-12058 … -12040: pinyin := ‘xu’;
-12039 … -11868: pinyin := ‘xuan’;
-11867 … -11862: pinyin := ‘xue’;
-11861 … -11848: pinyin := ‘xun’;
-11847 … -11832: pinyin := ‘ya’;
-11831 … -11799: pinyin := ‘yan’;
-11798 … -11782: pinyin := ‘yang’ ;
-11781 … -11605: pinyin := ‘yao’;
-11604 … -11590: pinyin := ‘ye’ ;
-11589 … -11537: pinyin := ‘yi’ ;
-11536 … -11359: pinyin := ‘yin’ ;
-11358 … -11341: pinyin := ‘ying’;
-11340 … -11340: pinyin := ‘yo’ ;
-11339 … -11325: pinyin := ‘yong’ ;
-11324 … -11304: pinyin := ‘you’ ;
-11303 … -11098: pinyin := ‘yu’ ;
-11097 … -11078: pinyin := ‘yuan’ ;
-11077 … -11068: pinyin := ‘yue’;
-11067 … -11056: pinyin := ‘yun’ ;
-11055 … -11053: pinyin := ‘za’ ;
-11052 … -11046: pinyin := ‘zai’ ;
-11045 … -11042: pinyin := ‘zan’ ;
-11041 … -11039: pinyin := ‘zang’;
-11038 … -11025: pinyin := ‘zao’ ;
-11024 … -11021: pinyin := ‘ze’ ;
-11020 … -11020: pinyin := ‘zei’ ;
-11019 … -11019: pinyin := ‘zen’ ;
-11018 … -11015: pinyin := ‘zeng’;
-11014 … -10839: pinyin := ‘zha’ ;
-10838 … -10833: pinyin := ‘zhai’;
-10832 … -10816: pinyin := ‘zhan’ ;
-10815 … -10801: pinyin := ‘zhang’ ;
-10800 … -10791: pinyin := ‘zhao’ ;
-10790 … -10781: pinyin := ‘zhe’ ;
-10780 … -10765: pinyin := ‘zhen’ ;
-10764 … -10588: pinyin := ‘zheng’ ;
-10587 … -10545: pinyin := ‘zhi’ ;
-10544 … -10534: pinyin := ‘zhong’ ;
-10533 … -10520: pinyin := ‘zhou’ ;
-10519 … -10332: pinyin := ‘zhu’ ;
-10331 … -10330: pinyin := ‘zhua’ ;
-10329 … -10329: pinyin := ‘zhuai’ ;
-10328 … -10323: pinyin := ‘zhuan’ ;
-10322 … -10316: pinyin := ‘zhuang’;
-10315 … -10310: pinyin := ‘zhui’ ;
-10309 … -10308: pinyin := ‘zhun’ ;
-10307 … -10297: pinyin := ‘zhuo’ ;
-10296 … -10282: pinyin := ‘zi’ ;
-10281 … -10275: pinyin := ‘zong’ ;
-10274 … -10271: pinyin := ‘zou’ ;
-10270 … -10263: pinyin := ‘zu’ ;
-10262 … -10261: pinyin := ‘zuan’ ;
-10260 … -10257: pinyin := ‘zui’ ;
-10256 … -10255: pinyin := ‘zun’ ;
-10254 … -10253: pinyin := ‘zuo’ ;
else
pinyin := s ;
end;
result:=pinyin;
基本上就是这么多,但拼音码经过我的测试,有很多是对不上的,诸如:da==》dai 有些汉字对应的拼音向下偏移了一些。我猜测应该是拼音和汉字的机内码对照出错——机内码没错。

之前看那个获取机内码的那个写的代码,在Delphi xe10,及11中编译没通过,因为我在xe及11中获取的汉字长度都是1,而不是2.
对于汉字转拼音的理解,主要是区位码,ASCII码,机内码,其中的关系转换我还需要继续努力!

本文标签: DELPHI关于汉字转拼音的一些想法