c#怎麼將漢字轉換為拼音原理講解,附現成代碼

如果您需要這個和我辛苦收集的更多類庫,請到下面圖片的水印免費下載

c#怎麼將漢字轉換為拼音原理講解,附現成代碼

2ym有個點vip

今天我們講的這個漢字轉換為拼音的類,在平時的項目中經常會用到,下面我們來講下原理,首先我們定義兩個字符串數組,getValue(用來保存所有拼音組合的unicode編碼),getName(用來保存所有拼音組合),請大家看下面這兩張圖片:

c#怎麼將漢字轉換為拼音原理講解,附現成代碼

所有拼音組合的UNICODE編碼

c#怎麼將漢字轉換為拼音原理講解,附現成代碼

編碼對應的所有拼音的組合

我們拿getValue數組中的第一個元素-20319編碼為例,他16進制後4位的編碼正好對應漢字中的“啊”,拼音也正好對應getName數組中的第一個元素“A”。以此類推,兩個數組都是一一對應的。

下面這張圖就是功能函數的前半段了

c#怎麼將漢字轉換為拼音原理講解,附現成代碼

功能函數前半段


首先創建了一個正則表達式的規則

Regex reg = new Regex("^[\\\\u4e00-\\\\u9fa5]$");

等下用它來驗證是否輸入的是漢字


下面這段主要就是申明一些等下要使用的變量,並且把輸入的字符串拆分成一個一個的漢字保持到一個字符數組裡面

byte[] arr = new byte[2];

string pystr = "";

int asc = 0, M1 = 0, M2 = 0;

char[] mChar = Chstr.ToCharArray();//獲取漢字對應的字符數組


下面這段就是主要算出asc變量的值,一個漢字的內碼有兩個字節(這裡僅僅討論GB2312,不適用別的編碼),可以用兩個數字M1 M2表示,M2表示低字節,M1表示高字節。-65536是對它整體取補碼,漢字內碼規定,最高位必須是1。

我們用10進制打比方,一個2位數可以用2個1位數表示,比如27,可以知道M1=2,M2=7,現在怎麼根據M1 M2還原回27呢?是不是2*10+7=27?(M1*10+M2)

一個10進制數字表示0~9,所以上一位就要乘以10。類似的,一個字節表示0~255(2的8次方-1),所以是M1*256+M2

arr = System.Text.Encoding.Default.GetBytes(mChar[j].ToString());//算出漢字的GB2312編碼

M1 = (short)(arr[0]);//取GB2312的高字節

M2 = (short)(arr[1]);//取GB2312的低字節

asc = M1 * 256 + M2 - 65536;


排除英文或半角字符,遇到直接返回本來的字符

if (asc > 0 && asc < 160)

{

pystr += mChar[j];

}


下圖就是根據asc變量的值將getName字符串中的拼音讀取出來返回。

c#怎麼將漢字轉換為拼音原理講解,附現成代碼

功能函數後半段


for (int i = (getValue.Length - 1); i >= 0; i--)

{

if (getValue[i] <= asc) //判斷漢字的拼音區編碼是否在指定範圍內

{

pystr += getName[i];//如果不超出範圍則獲取對應的拼音

break;

}

}


好啦,就寫道這裡,如果你看下GB編碼表就知道了,對於常用字,字的內碼是根據拼音的順序排列的,所以我們可以用查表的方法得到它的拼音,但是這個方法有缺陷,就是對於冷僻字,內碼單獨按照筆劃排列,所以用這個方法是存在問題的。

如果您需要這個和我辛苦收集的更多類庫,請到下面圖片的水印免費下載

c#怎麼將漢字轉換為拼音原理講解,附現成代碼

2ym有個點vip


分享到:


相關文章: