pinyin.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. package util
  2. import (
  3. "errors"
  4. "strings"
  5. "unicode/utf8"
  6. "github.com/qiniu/iconv"
  7. )
  8. func GetPinyin(text string) (string, string, error) {
  9. text = strings.Trim(text, " ")
  10. if text == "" {
  11. return "", "", nil
  12. }
  13. cd, _ := iconv.Open("gbk", "utf-8") // convert utf-8 to gbk
  14. defer cd.Close()
  15. buf := []byte(text)
  16. outBuf := make([]byte, 1024)
  17. cnBytes, _, err := cd.Conv(buf, outBuf)
  18. if err != nil {
  19. return "", "", err
  20. }
  21. var (
  22. cnsize int
  23. pinyin string
  24. jianpin string
  25. tempSpell string
  26. )
  27. for {
  28. r, size := utf8.DecodeRune(buf)
  29. if r == utf8.RuneError { //循环结束
  30. break
  31. }
  32. //cnStr := cd.ConvString(string(r))
  33. if size == 1 {
  34. cnsize = 1
  35. } else if size == 3 {
  36. cnsize = 2
  37. } else {
  38. return "", "", errors.New("wrong utf8 size")
  39. }
  40. ascode := GetCnAscii(cnBytes[0:cnsize])
  41. tempSpell = GetSpellByAscii(ascode)
  42. pinyin += tempSpell
  43. if cnsize == 2 {
  44. if len(tempSpell) > 1 && tempSpell[1] == 'h' {
  45. jianpin += tempSpell[0:2]
  46. } else if len(tempSpell) > 0 {
  47. jianpin += tempSpell[0:1]
  48. }
  49. } else {
  50. jianpin += tempSpell
  51. }
  52. buf = buf[size:]
  53. cnBytes = cnBytes[cnsize:]
  54. }
  55. return pinyin, jianpin, nil
  56. }
  57. func GetCnAscii(buf []byte) int {
  58. blen := len(buf)
  59. if blen <= 0 || blen > 2 {
  60. return 0
  61. }
  62. if blen == 1 {
  63. return int(buf[0])
  64. }
  65. if blen == 2 {
  66. ascii := (256*int(buf[0]) + int(buf[1])) - 256*256
  67. return ascii
  68. }
  69. return 0
  70. }
  71. func GetSpellByAscii(ascii int) string {
  72. if ascii > 0 && ascii < 160 { //单字符
  73. return string([]byte{uint8(ascii)})
  74. }
  75. if ascii < -20319 || ascii > -10247 { //不知道的字符
  76. return ""
  77. }
  78. var (
  79. asciiRangeLow = -20319
  80. asciiRangeHigh int
  81. spellLow string
  82. spellHigh string
  83. )
  84. pinyinList := getPyList()
  85. for _, pitem := range *pinyinList {
  86. spellHigh = pitem.Pinyin
  87. asciiRangeHigh = pitem.Code
  88. if ascii >= asciiRangeLow && ascii < asciiRangeHigh {
  89. if spellLow == "" {
  90. return spellHigh
  91. } else {
  92. return spellLow
  93. }
  94. } else {
  95. spellLow = spellHigh
  96. asciiRangeLow = asciiRangeHigh
  97. }
  98. }
  99. return ""
  100. }
  101. type pyItem struct {
  102. Pinyin string
  103. Code int
  104. }
  105. type PyList *[]pyItem
  106. var pyList PyList
  107. func getPyList() PyList {
  108. if pyList == nil {
  109. pyList = &[]pyItem{
  110. pyItem{"a", -20319},
  111. pyItem{"ai", -20317},
  112. pyItem{"an", -20304},
  113. pyItem{"ang", -20295},
  114. pyItem{"ao", -20292},
  115. pyItem{"ba", -20283},
  116. pyItem{"bai", -20265},
  117. pyItem{"ban", -20257},
  118. pyItem{"bang", -20242},
  119. pyItem{"bao", -20230},
  120. pyItem{"bei", -20051},
  121. pyItem{"ben", -20036},
  122. pyItem{"beng", -20032},
  123. pyItem{"bi", -20026},
  124. pyItem{"bian", -20002},
  125. pyItem{"biao", -19990},
  126. pyItem{"bie", -19986},
  127. pyItem{"bin", -19982},
  128. pyItem{"bing", -19976},
  129. pyItem{"bo", -19805},
  130. pyItem{"bu", -19784},
  131. pyItem{"ca", -19775},
  132. pyItem{"cai", -19774},
  133. pyItem{"can", -19763},
  134. pyItem{"cang", -19756},
  135. pyItem{"cao", -19751},
  136. pyItem{"ce", -19746},
  137. pyItem{"ceng", -19741},
  138. pyItem{"cha", -19739},
  139. pyItem{"chai", -19728},
  140. pyItem{"chan", -19725},
  141. pyItem{"chang", -19715},
  142. pyItem{"chao", -19540},
  143. pyItem{"che", -19531},
  144. pyItem{"chen", -19525},
  145. pyItem{"cheng", -19515},
  146. pyItem{"chi", -19500},
  147. pyItem{"chong", -19484},
  148. pyItem{"chou", -19479},
  149. pyItem{"chu", -19467},
  150. pyItem{"chuai", -19289},
  151. pyItem{"chuan", -19288},
  152. pyItem{"chuang", -19281},
  153. pyItem{"chui", -19275},
  154. pyItem{"chun", -19270},
  155. pyItem{"chuo", -19263},
  156. pyItem{"ci", -19261},
  157. pyItem{"cong", -19249},
  158. pyItem{"cou", -19243},
  159. pyItem{"cu", -19242},
  160. pyItem{"cuan", -19238},
  161. pyItem{"cui", -19235},
  162. pyItem{"cun", -19227},
  163. pyItem{"cuo", -19224},
  164. pyItem{"da", -19218},
  165. pyItem{"dai", -19212},
  166. pyItem{"dan", -19038},
  167. pyItem{"dang", -19023},
  168. pyItem{"dao", -19018},
  169. pyItem{"de", -19006},
  170. pyItem{"deng", -19003},
  171. pyItem{"di", -18996},
  172. pyItem{"dian", -18977},
  173. pyItem{"diao", -18961},
  174. pyItem{"die", -18952},
  175. pyItem{"ding", -18783},
  176. pyItem{"diu", -18774},
  177. pyItem{"dong", -18773},
  178. pyItem{"dou", -18763},
  179. pyItem{"du", -18756},
  180. pyItem{"duan", -18741},
  181. pyItem{"dui", -18735},
  182. pyItem{"dun", -18731},
  183. pyItem{"duo", -18722},
  184. pyItem{"e", -18710},
  185. pyItem{"en", -18697},
  186. pyItem{"er", -18696},
  187. pyItem{"fa", -18526},
  188. pyItem{"fan", -18518},
  189. pyItem{"fang", -18501},
  190. pyItem{"fei", -18490},
  191. pyItem{"fen", -18478},
  192. pyItem{"feng", -18463},
  193. pyItem{"fo", -18448},
  194. pyItem{"fou", -18447},
  195. pyItem{"fu", -18446},
  196. pyItem{"ga", -18239},
  197. pyItem{"gai", -18237},
  198. pyItem{"gan", -18231},
  199. pyItem{"gang", -18220},
  200. pyItem{"gao", -18211},
  201. pyItem{"ge", -18201},
  202. pyItem{"gei", -18184},
  203. pyItem{"gen", -18183},
  204. pyItem{"geng", -18181},
  205. pyItem{"gong", -18012},
  206. pyItem{"gou", -17997},
  207. pyItem{"gu", -17988},
  208. pyItem{"gua", -17970},
  209. pyItem{"guai", -17964},
  210. pyItem{"guan", -17961},
  211. pyItem{"guang", -17950},
  212. pyItem{"gui", -17947},
  213. pyItem{"gun", -17931},
  214. pyItem{"guo", -17928},
  215. pyItem{"ha", -17922},
  216. pyItem{"hai", -17759},
  217. pyItem{"han", -17752},
  218. pyItem{"hang", -17733},
  219. pyItem{"hao", -17730},
  220. pyItem{"he", -17721},
  221. pyItem{"hei", -17703},
  222. pyItem{"hen", -17701},
  223. pyItem{"heng", -17697},
  224. pyItem{"hong", -17692},
  225. pyItem{"hou", -17683},
  226. pyItem{"hu", -17676},
  227. pyItem{"hua", -17496},
  228. pyItem{"huai", -17487},
  229. pyItem{"huan", -17482},
  230. pyItem{"huang", -17468},
  231. pyItem{"hui", -17454},
  232. pyItem{"hun", -17433},
  233. pyItem{"huo", -17427},
  234. pyItem{"ji", -17417},
  235. pyItem{"jia", -17202},
  236. pyItem{"jian", -17185},
  237. pyItem{"jiang", -16983},
  238. pyItem{"jiao", -16970},
  239. pyItem{"jie", -16942},
  240. pyItem{"jin", -16915},
  241. pyItem{"jing", -16733},
  242. pyItem{"jiong", -16708},
  243. pyItem{"jiu", -16706},
  244. pyItem{"ju", -16689},
  245. pyItem{"juan", -16664},
  246. pyItem{"jue", -16657},
  247. pyItem{"jun", -16647},
  248. pyItem{"ka", -16474},
  249. pyItem{"kai", -16470},
  250. pyItem{"kan", -16465},
  251. pyItem{"kang", -16459},
  252. pyItem{"kao", -16452},
  253. pyItem{"ke", -16448},
  254. pyItem{"ken", -16433},
  255. pyItem{"keng", -16429},
  256. pyItem{"kong", -16427},
  257. pyItem{"kou", -16423},
  258. pyItem{"ku", -16419},
  259. pyItem{"kua", -16412},
  260. pyItem{"kuai", -16407},
  261. pyItem{"kuan", -16403},
  262. pyItem{"kuang", -16401},
  263. pyItem{"kui", -16393},
  264. pyItem{"kun", -16220},
  265. pyItem{"kuo", -16216},
  266. pyItem{"la", -16212},
  267. pyItem{"lai", -16205},
  268. pyItem{"lan", -16202},
  269. pyItem{"lang", -16187},
  270. pyItem{"lao", -16180},
  271. pyItem{"le", -16171},
  272. pyItem{"lei", -16169},
  273. pyItem{"leng", -16158},
  274. pyItem{"li", -16155},
  275. pyItem{"lia", -15959},
  276. pyItem{"lian", -15958},
  277. pyItem{"liang", -15944},
  278. pyItem{"liao", -15933},
  279. pyItem{"lie", -15920},
  280. pyItem{"lin", -15915},
  281. pyItem{"ling", -15903},
  282. pyItem{"liu", -15889},
  283. pyItem{"long", -15878},
  284. pyItem{"lou", -15707},
  285. pyItem{"lu", -15701},
  286. pyItem{"lv", -15681},
  287. pyItem{"luan", -15667},
  288. pyItem{"lue", -15661},
  289. pyItem{"lun", -15659},
  290. pyItem{"luo", -15652},
  291. pyItem{"ma", -15640},
  292. pyItem{"mai", -15631},
  293. pyItem{"man", -15625},
  294. pyItem{"mang", -15454},
  295. pyItem{"mao", -15448},
  296. pyItem{"me", -15436},
  297. pyItem{"mei", -15435},
  298. pyItem{"men", -15419},
  299. pyItem{"meng", -15416},
  300. pyItem{"mi", -15408},
  301. pyItem{"mian", -15394},
  302. pyItem{"miao", -15385},
  303. pyItem{"mie", -15377},
  304. pyItem{"min", -15375},
  305. pyItem{"ming", -15369},
  306. pyItem{"miu", -15363},
  307. pyItem{"mo", -15362},
  308. pyItem{"mou", -15183},
  309. pyItem{"mu", -15180},
  310. pyItem{"na", -15165},
  311. pyItem{"nai", -15158},
  312. pyItem{"nan", -15153},
  313. pyItem{"nang", -15150},
  314. pyItem{"nao", -15149},
  315. pyItem{"ne", -15144},
  316. pyItem{"nei", -15143},
  317. pyItem{"nen", -15141},
  318. pyItem{"neng", -15140},
  319. pyItem{"ni", -15139},
  320. pyItem{"nian", -15128},
  321. pyItem{"niang", -15121},
  322. pyItem{"niao", -15119},
  323. pyItem{"nie", -15117},
  324. pyItem{"nin", -15110},
  325. pyItem{"ning", -15109},
  326. pyItem{"niu", -14941},
  327. pyItem{"nong", -14937},
  328. pyItem{"nu", -14933},
  329. pyItem{"nv", -14930},
  330. pyItem{"nuan", -14929},
  331. pyItem{"nue", -14928},
  332. pyItem{"nuo", -14926},
  333. pyItem{"o", -14922},
  334. pyItem{"ou", -14921},
  335. pyItem{"pa", -14914},
  336. pyItem{"pai", -14908},
  337. pyItem{"pan", -14902},
  338. pyItem{"pang", -14894},
  339. pyItem{"pao", -14889},
  340. pyItem{"pei", -14882},
  341. pyItem{"pen", -14873},
  342. pyItem{"peng", -14871},
  343. pyItem{"pi", -14857},
  344. pyItem{"pian", -14678},
  345. pyItem{"piao", -14674},
  346. pyItem{"pie", -14670},
  347. pyItem{"pin", -14668},
  348. pyItem{"ping", -14663},
  349. pyItem{"po", -14654},
  350. pyItem{"pu", -14645},
  351. pyItem{"qi", -14630},
  352. pyItem{"qia", -14594},
  353. pyItem{"qian", -14429},
  354. pyItem{"qiang", -14407},
  355. pyItem{"qiao", -14399},
  356. pyItem{"qie", -14384},
  357. pyItem{"qin", -14379},
  358. pyItem{"qing", -14368},
  359. pyItem{"qiong", -14355},
  360. pyItem{"qiu", -14353},
  361. pyItem{"qu", -14345},
  362. pyItem{"quan", -14170},
  363. pyItem{"que", -14159},
  364. pyItem{"qun", -14151},
  365. pyItem{"ran", -14149},
  366. pyItem{"rang", -14145},
  367. pyItem{"rao", -14140},
  368. pyItem{"re", -14137},
  369. pyItem{"ren", -14135},
  370. pyItem{"reng", -14125},
  371. pyItem{"ri", -14123},
  372. pyItem{"rong", -14122},
  373. pyItem{"rou", -14112},
  374. pyItem{"ru", -14109},
  375. pyItem{"ruan", -14099},
  376. pyItem{"rui", -14097},
  377. pyItem{"run", -14094},
  378. pyItem{"ruo", -14092},
  379. pyItem{"sa", -14090},
  380. pyItem{"sai", -14087},
  381. pyItem{"san", -14083},
  382. pyItem{"sang", -13917},
  383. pyItem{"sao", -13914},
  384. pyItem{"se", -13910},
  385. pyItem{"sen", -13907},
  386. pyItem{"seng", -13906},
  387. pyItem{"sha", -13905},
  388. pyItem{"shai", -13896},
  389. pyItem{"shan", -13894},
  390. pyItem{"shang", -13878},
  391. pyItem{"shao", -13870},
  392. pyItem{"she", -13859},
  393. pyItem{"shen", -13847},
  394. pyItem{"sheng", -13831},
  395. pyItem{"shi", -13658},
  396. pyItem{"shou", -13611},
  397. pyItem{"shu", -13601},
  398. pyItem{"shua", -13406},
  399. pyItem{"shuai", -13404},
  400. pyItem{"shuan", -13400},
  401. pyItem{"shuang", -13398},
  402. pyItem{"shui", -13395},
  403. pyItem{"shun", -13391},
  404. pyItem{"shuo", -13387},
  405. pyItem{"si", -13383},
  406. pyItem{"song", -13367},
  407. pyItem{"sou", -13359},
  408. pyItem{"su", -13356},
  409. pyItem{"suan", -13343},
  410. pyItem{"sui", -13340},
  411. pyItem{"sun", -13329},
  412. pyItem{"suo", -13326},
  413. pyItem{"ta", -13318},
  414. pyItem{"tai", -13147},
  415. pyItem{"tan", -13138},
  416. pyItem{"tang", -13120},
  417. pyItem{"tao", -13107},
  418. pyItem{"te", -13096},
  419. pyItem{"teng", -13095},
  420. pyItem{"ti", -13091},
  421. pyItem{"tian", -13076},
  422. pyItem{"tiao", -13068},
  423. pyItem{"tie", -13063},
  424. pyItem{"ting", -13060},
  425. pyItem{"tong", -12888},
  426. pyItem{"tou", -12875},
  427. pyItem{"tu", -12871},
  428. pyItem{"tuan", -12860},
  429. pyItem{"tui", -12858},
  430. pyItem{"tun", -12852},
  431. pyItem{"tuo", -12849},
  432. pyItem{"wa", -12838},
  433. pyItem{"wai", -12831},
  434. pyItem{"wan", -12829},
  435. pyItem{"wang", -12812},
  436. pyItem{"wei", -12802},
  437. pyItem{"wen", -12607},
  438. pyItem{"weng", -12597},
  439. pyItem{"wo", -12594},
  440. pyItem{"wu", -12585},
  441. pyItem{"xi", -12556},
  442. pyItem{"xia", -12359},
  443. pyItem{"xian", -12346},
  444. pyItem{"xiang", -12320},
  445. pyItem{"xiao", -12300},
  446. pyItem{"xie", -12120},
  447. pyItem{"xin", -12099},
  448. pyItem{"xing", -12089},
  449. pyItem{"xiong", -12074},
  450. pyItem{"xiu", -12067},
  451. pyItem{"xu", -12058},
  452. pyItem{"xuan", -12039},
  453. pyItem{"xue", -11867},
  454. pyItem{"xun", -11861},
  455. pyItem{"ya", -11847},
  456. pyItem{"yan", -11831},
  457. pyItem{"yang", -11798},
  458. pyItem{"yao", -11781},
  459. pyItem{"ye", -11604},
  460. pyItem{"yi", -11589},
  461. pyItem{"yin", -11536},
  462. pyItem{"ying", -11358},
  463. pyItem{"yo", -11340},
  464. pyItem{"yong", -11339},
  465. pyItem{"you", -11324},
  466. pyItem{"yu", -11303},
  467. pyItem{"yuan", -11097},
  468. pyItem{"yue", -11077},
  469. pyItem{"yun", -11067},
  470. pyItem{"za", -11055},
  471. pyItem{"zai", -11052},
  472. pyItem{"zan", -11045},
  473. pyItem{"zang", -11041},
  474. pyItem{"zao", -11038},
  475. pyItem{"ze", -11024},
  476. pyItem{"zei", -11020},
  477. pyItem{"zen", -11019},
  478. pyItem{"zeng", -11018},
  479. pyItem{"zha", -11014},
  480. pyItem{"zhai", -10838},
  481. pyItem{"zhan", -10832},
  482. pyItem{"zhang", -10815},
  483. pyItem{"zhao", -10800},
  484. pyItem{"zhe", -10790},
  485. pyItem{"zhen", -10780},
  486. pyItem{"zheng", -10764},
  487. pyItem{"zhi", -10587},
  488. pyItem{"zhong", -10544},
  489. pyItem{"zhou", -10533},
  490. pyItem{"zhu", -10519},
  491. pyItem{"zhua", -10331},
  492. pyItem{"zhuai", -10329},
  493. pyItem{"zhuan", -10328},
  494. pyItem{"zhuang", -10322},
  495. pyItem{"zhui", -10315},
  496. pyItem{"zhun", -10309},
  497. pyItem{"zhuo", -10307},
  498. pyItem{"zi", -10296},
  499. pyItem{"zong", -10281},
  500. pyItem{"zou", -10274},
  501. pyItem{"zu", -10270},
  502. pyItem{"zuan", -10262},
  503. pyItem{"zui", -10260},
  504. pyItem{"zun", -10256},
  505. pyItem{"zuo", -10254},
  506. }
  507. }
  508. return pyList
  509. }