/** * Copyright 2015-2025 FLY的狐狸(email:jflyfox@sina.com qq:369191470). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.jflyfox.util.extend; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Set; import com.jflyfox.util.StrUtils; /** * 汉字转化为全拼 * */ public class CnToSpell { private static LinkedHashMap spellMap = null; static { if (spellMap == null) { spellMap = new LinkedHashMap(400); } initialize(); } private CnToSpell() { } private static void spellPut(String spell, int ascii) { spellMap.put(spell, new Integer(ascii)); } private static void initialize() { spellPut(" a ", -20319); spellPut(" ai ", -20317); spellPut(" an ", -20304); spellPut(" ang ", -20295); spellPut(" ao ", -20292); spellPut(" ba ", -20283); spellPut(" bai ", -20265); spellPut(" ban ", -20257); spellPut(" bang ", -20242); spellPut(" bao ", -20230); spellPut(" bei ", -20051); spellPut(" ben ", -20036); spellPut(" beng ", -20032); spellPut(" bi ", -20026); spellPut(" bian ", -20002); spellPut(" biao ", -19990); spellPut(" bie ", -19986); spellPut(" bin ", -19982); spellPut(" bing ", -19976); spellPut(" bo ", -19805); spellPut(" bu ", -19784); spellPut(" ca ", -19775); spellPut(" cai ", -19774); spellPut(" can ", -19763); spellPut(" cang ", -19756); spellPut(" cao ", -19751); spellPut(" ce ", -19746); spellPut(" ceng ", -19741); spellPut(" cha ", -19739); spellPut(" chai ", -19728); spellPut(" chan ", -19725); spellPut(" chang ", -19715); spellPut(" chao ", -19540); spellPut(" che ", -19531); spellPut(" chen ", -19525); spellPut(" cheng ", -19515); spellPut(" chi ", -19500); spellPut(" chong ", -19484); spellPut(" chou ", -19479); spellPut(" chu ", -19467); spellPut(" chuai ", -19289); spellPut(" chuan ", -19288); spellPut(" chuang ", -19281); spellPut(" chui ", -19275); spellPut(" chun ", -19270); spellPut(" chuo ", -19263); spellPut(" ci ", -19261); spellPut(" cong ", -19249); spellPut(" cou ", -19243); spellPut(" cu ", -19242); spellPut(" cuan ", -19238); spellPut(" cui ", -19235); spellPut(" cun ", -19227); spellPut(" cuo ", -19224); spellPut(" da ", -19218); spellPut(" dai ", -19212); spellPut(" dan ", -19038); spellPut(" dang ", -19023); spellPut(" dao ", -19018); spellPut(" de ", -19006); spellPut(" deng ", -19003); spellPut(" di ", -18996); spellPut(" dian ", -18977); spellPut(" diao ", -18961); spellPut(" die ", -18952); spellPut(" ding ", -18783); spellPut(" diu ", -18774); spellPut(" dong ", -18773); spellPut(" dou ", -18763); spellPut(" du ", -18756); spellPut(" duan ", -18741); spellPut(" dui ", -18735); spellPut(" dun ", -18731); spellPut(" duo ", -18722); spellPut(" e ", -18710); spellPut(" en ", -18697); spellPut(" er ", -18696); spellPut(" fa ", -18526); spellPut(" fan ", -18518); spellPut(" fang ", -18501); spellPut(" fei ", -18490); spellPut(" fen ", -18478); spellPut(" feng ", -18463); spellPut(" fo ", -18448); spellPut(" fou ", -18447); spellPut(" fu ", -18446); spellPut(" ga ", -18239); spellPut(" gai ", -18237); spellPut(" gan ", -18231); spellPut(" gang ", -18220); spellPut(" gao ", -18211); spellPut(" ge ", -18201); spellPut(" gei ", -18184); spellPut(" gen ", -18183); spellPut(" geng ", -18181); spellPut(" gong ", -18012); spellPut(" gou ", -17997); spellPut(" gu ", -17988); spellPut(" gua ", -17970); spellPut(" guai ", -17964); spellPut(" guan ", -17961); spellPut(" guang ", -17950); spellPut(" gui ", -17947); spellPut(" gun ", -17931); spellPut(" guo ", -17928); spellPut(" ha ", -17922); spellPut(" hai ", -17759); spellPut(" han ", -17752); spellPut(" hang ", -17733); spellPut(" hao ", -17730); spellPut(" he ", -17721); spellPut(" hei ", -17703); spellPut(" hen ", -17701); spellPut(" heng ", -17697); spellPut(" hong ", -17692); spellPut(" hou ", -17683); spellPut(" hu ", -17676); spellPut(" hua ", -17496); spellPut(" huai ", -17487); spellPut(" huan ", -17482); spellPut(" huang ", -17468); spellPut(" hui ", -17454); spellPut(" hun ", -17433); spellPut(" huo ", -17427); spellPut(" ji ", -17417); spellPut(" jia ", -17202); spellPut(" jian ", -17185); spellPut(" jiang ", -16983); spellPut(" jiao ", -16970); spellPut(" jie ", -16942); spellPut(" jin ", -16915); spellPut(" jing ", -16733); spellPut(" jiong ", -16708); spellPut(" jiu ", -16706); spellPut(" ju ", -16689); spellPut(" juan ", -16664); spellPut(" jue ", -16657); spellPut(" jun ", -16647); spellPut(" ka ", -16474); spellPut(" kai ", -16470); spellPut(" kan ", -16465); spellPut(" kang ", -16459); spellPut(" kao ", -16452); spellPut(" ke ", -16448); spellPut(" ken ", -16433); spellPut(" keng ", -16429); spellPut(" kong ", -16427); spellPut(" kou ", -16423); spellPut(" ku ", -16419); spellPut(" kua ", -16412); spellPut(" kuai ", -16407); spellPut(" kuan ", -16403); spellPut(" kuang ", -16401); spellPut(" kui ", -16393); spellPut(" kun ", -16220); spellPut(" kuo ", -16216); spellPut(" la ", -16212); spellPut(" lai ", -16205); spellPut(" lan ", -16202); spellPut(" lang ", -16187); spellPut(" lao ", -16180); spellPut(" le ", -16171); spellPut(" lei ", -16169); spellPut(" leng ", -16158); spellPut(" li ", -16155); spellPut(" lia ", -15959); spellPut(" lian ", -15958); spellPut(" liang ", -15944); spellPut(" liao ", -15933); spellPut(" lie ", -15920); spellPut(" lin ", -15915); spellPut(" ling ", -15903); spellPut(" liu ", -15889); spellPut(" long ", -15878); spellPut(" lou ", -15707); spellPut(" lu ", -15701); spellPut(" lv ", -15681); spellPut(" luan ", -15667); spellPut(" lue ", -15661); spellPut(" lun ", -15659); spellPut(" luo ", -15652); spellPut(" ma ", -15640); spellPut(" mai ", -15631); spellPut(" man ", -15625); spellPut(" mang ", -15454); spellPut(" mao ", -15448); spellPut(" me ", -15436); spellPut(" mei ", -15435); spellPut(" men ", -15419); spellPut(" meng ", -15416); spellPut(" mi ", -15408); spellPut(" mian ", -15394); spellPut(" miao ", -15385); spellPut(" mie ", -15377); spellPut(" min ", -15375); spellPut(" ming ", -15369); spellPut(" miu ", -15363); spellPut(" mo ", -15362); spellPut(" mou ", -15183); spellPut(" mu ", -15180); spellPut(" na ", -15165); spellPut(" nai ", -15158); spellPut(" nan ", -15153); spellPut(" nang ", -15150); spellPut(" nao ", -15149); spellPut(" ne ", -15144); spellPut(" nei ", -15143); spellPut(" nen ", -15141); spellPut(" neng ", -15140); spellPut(" ni ", -15139); spellPut(" nian ", -15128); spellPut(" niang ", -15121); spellPut(" niao ", -15119); spellPut(" nie ", -15117); spellPut(" nin ", -15110); spellPut(" ning ", -15109); spellPut(" niu ", -14941); spellPut(" nong ", -14937); spellPut(" nu ", -14933); spellPut(" nv ", -14930); spellPut(" nuan ", -14929); spellPut(" nue ", -14928); spellPut(" nuo ", -14926); spellPut(" o ", -14922); spellPut(" ou ", -14921); spellPut(" pa ", -14914); spellPut(" pai ", -14908); spellPut(" pan ", -14902); spellPut(" pang ", -14894); spellPut(" pao ", -14889); spellPut(" pei ", -14882); spellPut(" pen ", -14873); spellPut(" peng ", -14871); spellPut(" pi ", -14857); spellPut(" pian ", -14678); spellPut(" piao ", -14674); spellPut(" pie ", -14670); spellPut(" pin ", -14668); spellPut(" ping ", -14663); spellPut(" po ", -14654); spellPut(" pu ", -14645); spellPut(" qi ", -14630); spellPut(" qia ", -14594); spellPut(" qian ", -14429); spellPut(" qiang ", -14407); spellPut(" qiao ", -14399); spellPut(" qie ", -14384); spellPut(" qin ", -14379); spellPut(" qing ", -14368); spellPut(" qiong ", -14355); spellPut(" qiu ", -14353); spellPut(" qu ", -14345); spellPut(" quan ", -14170); spellPut(" que ", -14159); spellPut(" qun ", -14151); spellPut(" ran ", -14149); spellPut(" rang ", -14145); spellPut(" rao ", -14140); spellPut(" re ", -14137); spellPut(" ren ", -14135); spellPut(" reng ", -14125); spellPut(" ri ", -14123); spellPut(" rong ", -14122); spellPut(" rou ", -14112); spellPut(" ru ", -14109); spellPut(" ruan ", -14099); spellPut(" rui ", -14097); spellPut(" run ", -14094); spellPut(" ruo ", -14092); spellPut(" sa ", -14090); spellPut(" sai ", -14087); spellPut(" san ", -14083); spellPut(" sang ", -13917); spellPut(" sao ", -13914); spellPut(" se ", -13910); spellPut(" sen ", -13907); spellPut(" seng ", -13906); spellPut(" sha ", -13905); spellPut(" shai ", -13896); spellPut(" shan ", -13894); spellPut(" shang ", -13878); spellPut(" shao ", -13870); spellPut(" she ", -13859); spellPut(" shen ", -13847); spellPut(" sheng ", -13831); spellPut(" shi ", -13658); spellPut(" shou ", -13611); spellPut(" shu ", -13601); spellPut(" shua ", -13406); spellPut(" shuai ", -13404); spellPut(" shuan ", -13400); spellPut(" shuang ", -13398); spellPut(" shui ", -13395); spellPut(" shun ", -13391); spellPut(" shuo ", -13387); spellPut(" si ", -13383); spellPut(" song ", -13367); spellPut(" sou ", -13359); spellPut(" su ", -13356); spellPut(" suan ", -13343); spellPut(" sui ", -13340); spellPut(" sun ", -13329); spellPut(" suo ", -13326); spellPut(" ta ", -13318); spellPut(" tai ", -13147); spellPut(" tan ", -13138); spellPut(" tang ", -13120); spellPut(" tao ", -13107); spellPut(" te ", -13096); spellPut(" teng ", -13095); spellPut(" ti ", -13091); spellPut(" tian ", -13076); spellPut(" tiao ", -13068); spellPut(" tie ", -13063); spellPut(" ting ", -13060); spellPut(" tong ", -12888); spellPut(" tou ", -12875); spellPut(" tu ", -12871); spellPut(" tuan ", -12860); spellPut(" tui ", -12858); spellPut(" tun ", -12852); spellPut(" tuo ", -12849); spellPut(" wa ", -12838); spellPut(" wai ", -12831); spellPut(" wan ", -12829); spellPut(" wang ", -12812); spellPut(" wei ", -12802); spellPut(" wen ", -12607); spellPut(" weng ", -12597); spellPut(" wo ", -12594); spellPut(" wu ", -12585); spellPut(" xi ", -12556); spellPut(" xia ", -12359); spellPut(" xian ", -12346); spellPut(" xiang ", -12320); spellPut(" xiao ", -12300); spellPut(" xie ", -12120); spellPut(" xin ", -12099); spellPut(" xing ", -12089); spellPut(" xiong ", -12074); spellPut(" xiu ", -12067); spellPut(" xu ", -12058); spellPut(" xuan ", -12039); spellPut(" xue ", -11867); spellPut(" xun ", -11861); spellPut(" ya ", -11847); spellPut(" yan ", -11831); spellPut(" yang ", -11798); spellPut(" yao ", -11781); spellPut(" ye ", -11604); spellPut(" yi ", -11589); spellPut(" yin ", -11536); spellPut(" ying ", -11358); spellPut(" yo ", -11340); spellPut(" yong ", -11339); spellPut(" you ", -11324); spellPut(" yu ", -11303); spellPut(" yuan ", -11097); spellPut(" yue ", -11077); spellPut(" yun ", -11067); spellPut(" za ", -11055); spellPut(" zai ", -11052); spellPut(" zan ", -11045); spellPut(" zang ", -11041); spellPut(" zao ", -11038); spellPut(" ze ", -11024); spellPut(" zei ", -11020); spellPut(" zen ", -11019); spellPut(" zeng ", -11018); spellPut(" zha ", -11014); spellPut(" zhai ", -10838); spellPut(" zhan ", -10832); spellPut(" zhang ", -10815); spellPut(" zhao ", -10800); spellPut(" zhe ", -10790); spellPut(" zhen ", -10780); spellPut(" zheng ", -10764); spellPut(" zhi ", -10587); spellPut(" zhong ", -10544); spellPut(" zhou ", -10533); spellPut(" zhu ", -10519); spellPut(" zhua ", -10331); spellPut(" zhuai ", -10329); spellPut(" zhuan ", -10328); spellPut(" zhuang ", -10322); spellPut(" zhui ", -10315); spellPut(" zhun ", -10309); spellPut(" zhuo ", -10307); spellPut(" zi ", -10296); spellPut(" zong ", -10281); spellPut(" zou ", -10274); spellPut(" zu ", -10270); spellPut(" zuan ", -10262); spellPut(" zui ", -10260); spellPut(" zun ", -10256); spellPut(" zuo ", -10254); } /** * 获得单个汉字的Ascii. * * @param cn * char 汉字字符 * @return int 错误返回 0,否则返回ascii */ public static int getCnAscii(char cn) { byte[] bytes = (String.valueOf(cn)).getBytes(); if (bytes == null || bytes.length > 2 || bytes.length <= 0) { // 错误 return 0; } if (bytes.length == 1) { // 英文字符 return bytes[0]; } if (bytes.length == 2) { // 中文字符 int hightByte = 256 + bytes[0]; int lowByte = 256 + bytes[1]; int ascii = (256 * hightByte + lowByte) - 256 * 256; // System.out.println("ASCII=" + ascii); return ascii; } return 0; // 错误 } /** * 根据ASCII码到SpellMap中查找对应的拼音 * * @param ascii * int 字符对应的ASCII * @return String 拼音,首先判断ASCII是否>0&<160,如果是返回对应的字符, * * 否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音. */ public static String getSpellByAscii(int ascii) { if (ascii > 0 && ascii < 160) { // 单字符 return String.valueOf((char) ascii); } if (ascii < -20319 || ascii > -10247) { // 不知道的字符 return null; } Set keySet = spellMap.keySet(); Iterator it = keySet.iterator(); String spell0 = null; ; String spell = null; int asciiRang0 = -20319; int asciiRang; while (it.hasNext()) { spell = (String) it.next(); Object valObj = spellMap.get(spell); if (valObj instanceof Integer) { asciiRang = ((Integer) valObj).intValue(); if (ascii >= asciiRang0 && ascii < asciiRang) { // 区间找到 return (spell0 == null) ? spell : spell0; } else { spell0 = spell; asciiRang0 = asciiRang; } } } return null; } /** * 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换 * * @param cnStr * String 字符串 * @return String 转换成全拼后的字符串 */ public static String getFullSpell(String cnStr) { if (null == cnStr || "".equals(cnStr.trim())) { return cnStr; } char[] chars = cnStr.toCharArray(); StringBuffer retuBuf = new StringBuffer(); for (int i = 0, Len = chars.length; i < Len; i++) { int ascii = getCnAscii(chars[i]); if (ascii == 0) { // 取ascii时出错 retuBuf.append(chars[i]); } else { String spell = getSpellByAscii(ascii); if (spell == null) { retuBuf.append(chars[i]); } else { retuBuf.append(spell); } // end of if spell == null } // end of if ascii <= -20400 } // end of for return retuBuf.toString(); } public static String getFirstSpell(String cnStr) { return null; } public static void main(String[] args) { String str = null; str = " 小红帽 "; System.out.println(" Spell= " + StrUtils.clear(CnToSpell.getFullSpell(str))); } }