現在主流的轉換有三種:hash匹配,Npinyin,微軟PinYinConverter
這邊是優先使用Npinyin 翻譯失敗的使用微軟PinYinConverter
經測試大部分生僻字翻譯都OK,多音字還是有概率分辨不對(也可能是因為我用的DLL並不是最新版),只能怪我中華文化實在博大精深了,蛤蛤
還有數字和字母的互相轉換也一並放進去了~
數字轉換是1-26轉換為小寫a-z,字母轉換是大寫A-Z和小寫a-z轉換為1-26,原理就是ASCII碼的一些計算
代碼如下:
using Microsoft.International.Converters.PinYinConverter; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WebUtility { public class PingYinHelper { private static Encoding gb2312 = Encoding.GetEncoding("GB2312"); /// <summary> /// 漢字轉全拼 /// </summary> /// <param name="strChinese"></param> /// <returns></returns> public static string ConvertToAllSpell(string strChinese) { try { if (strChinese.Length != 0) { StringBuilder fullSpell = new StringBuilder(); for (int i = 0; i < strChinese.Length; i++) { var chr = strChinese[i]; fullSpell.Append(GetSpell(chr)); } return fullSpell.ToString(); } } catch (Exception e) { Console.WriteLine("全拼轉化出錯!" + e.Message); } return string.Empty; } /// <summary> /// 漢字轉首字母 /// </summary> /// <param name="strChinese"></param> /// <returns></returns> public static string ConvertToFirstSpell(string strChinese) { try { if (strChinese.Length != 0) { StringBuilder fullSpell = new StringBuilder(); for (int i = 0; i < strChinese.Length; i++) { var chr = strChinese[i]; fullSpell.Append(GetSpell(chr)[0]); } return fullSpell.ToString(); } } catch (Exception e) { Console.WriteLine("首字母轉化出錯!" + e.Message); } return string.Empty; } private static string GetSpell(char chr) { var coverchr = NPinyin.Pinyin.GetPinyin(chr); bool isChineses = ChineseChar.IsValidChar(coverchr[0]); if (isChineses) { ChineseChar chineseChar = new ChineseChar(coverchr[0]); foreach (string value in chineseChar.Pinyins) { if (!string.IsNullOrEmpty(value)) { return value.Remove(value.Length - 1, 1); } } } return coverchr; } /// <summary> /// 數字轉換成字母(1-26) /// </summary> /// <param name="number"></param> /// <returns></returns> public static string NumToChar(int number) { number = number + 64; if (65 <= number && 90 >= number) { System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); byte[] btNumber = new byte[] { (byte)number }; return asciiEncoding.GetString(btNumber).ToLower(); } return "數字不在轉換范圍內"; } /// <summary> /// 字母轉換成數字(1-26) /// </summary> /// <param name="str"></param> /// <returns></returns> public static string CharToNum(char chr) { byte[] array = new byte[1]; array = System.Text.Encoding.ASCII.GetBytes(chr.ToString().ToUpper()); int asciicode = (short)(array[0]) - 64; return Convert.ToString(asciicode); } } }
最后附上這邊用上的兩個DLL文件,並不是最新版本
https://files.cnblogs.com/files/cn2018/ConvertToPinYin.zip
備用下載地址:
NPINYIN,不能識別的字很少,而且還在不斷維護更新,日趨完美。
在googlecode可以看到它的開源項目,http://code.google.com/p/npinyin/
下載地址
dll:http://files.cnblogs.com/files/guohu/NPinyin-0.2.4588.20158-bin.zip
源碼:http://files.cnblogs.com/files/guohu/NPinyin-0.2.x-source_code.zip
Microsoft.International.Converters.PinYinConverter
原文鏈接:http://outofmemory.cn/code-snippet/4392/ms-CHSPinYinConv-convert-hanzi-to-pinyin
微軟為中文,日文以及韓文提供了額外的支持,我們可以從微軟的網站上下載相關文字處理的類庫,下載地址如下:
http://download.microsoft.com/download/5/7/3/57345088-ACF8-4E9B-A9A7-EBA35452DEF2/vsintlpack1.zip
下載的是一個zip包,里面有多個安裝文件,我們只安裝“CHSPinYinConv.msi”就可以了,安裝之后在安裝目錄下會有“ChnCharInfo.dll”文件,這個文件可以做漢字相關的處理,不止有文字,還有筆畫讀音等漢字相關的信息。
