c#取汉字拼音首字母
代码
/// <summary>
/// GB2312的拼音算法,不支持多音字
/// </summary>
public class GB2Alpha
{
public static void GetAlpha(string a)
{
int aa = Convert.ToInt32(a[0]);
byte[] arr = System.Text.Encoding.ASCII.GetBytes(a);
char c = convert(aa);
}
//汉字首字母转换表
private static char convert(int n)
{
if (In(0xB0A1, 0xB0C4, n)) return 'A';
if (In(0XB0C5, 0XB2C0, n)) return 'B';
if (In(0xB2C1, 0xB4ED, n)) return 'C';
if (In(0xB4EE, 0xB6E9, n)) return 'D';
if (In(0xB6EA, 0xB7A1, n)) return 'E';
if (In(0xB7A2, 0xB8c0, n)) return 'F';
if (In(0xB8C1, 0xB9FD, n)) return 'G';
if (In(0xB9FE, 0xBBF6, n)) return 'H';
if (In(0xBBF7, 0xBFA5, n)) return 'J';
if (In(0xBFA6, 0xC0AB, n)) return 'K';
if (In(0xC0AC, 0xC2E7, n)) return 'L';
if (In(0xC2E8, 0xC4C2, n)) return 'M';
if (In(0xC4C3, 0xC5B5, n)) return 'N';
if (In(0xC5B6, 0xC5BD, n)) return 'O';
if (In(0xC5BE, 0xC6D9, n)) return 'P';
if (In(0xC6DA, 0xC8BA, n)) return 'Q';
if (In(0xC8BB, 0xC8F5, n)) return 'R';
if (In(0xC8F6, 0xCBF0, n)) return 'S';
if (In(0xCBFA, 0xCDD9, n)) return 'T';
if (In(0xCDDA, 0xCEF3, n)) return 'W';
if (In(0xCEF4, 0xD188, n)) return 'X';
if (In(0xD1B9, 0xD4D0, n)) return 'Y';
if (In(0xD4D1, 0xD7F9, n)) return 'Z';
return '\0';
}
private static bool In(int start, int end, int code)
{
if (code >= start && code <= end)
{
return true;
}
return false;
}
}
/// <summary>
/// 拼音首字母,支持多音字,
/// ,确保pinyin3.txt中汉字编码是连续的,汉字编码减去MinChar就得到在数组中的index,从而避免了作循环检测的消耗,所以全角字母的检测放在代码里面而没有放在pinyin3.txt中
/// </summary>
public static class CSpell
{
private static int MinChar;
private static int MaxChar;
/// <summary>
/// 确保pinyin3.txt中汉字编码是连续的,因为算法中要作减法运算
/// </summary>
private static string[] Lines;
static bool init = false;
/// <summary>
/// 初始化
/// </summary>
internal static void Init()
{
if (init) return;
init = true;
Lines = Resource1.pinyin3.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
MinChar = (int)(Lines[0][0]);
MaxChar = (int)(Lines[Lines.Length - 1][0]);
}
/// <summary>
/// 检测,区分大小写,“浦发银行”=="YH"/"YX"
/// </summary>
public static bool HitTestSpell(string strOrigin, string strCompare)
{
string[][] arrStr = GetStringSpell(strOrigin);
if (strCompare.Length > strOrigin.Length) return false;
int index, beginIndex = 0;
for (int i = 0; i < strCompare.Length; i++)
{
index = Find(arrStr, strCompare[i].ToString(), beginIndex);
if (index < 0)
{
return false;
}
else
{
//如果多次找到的拼音不连续,则失败
if (beginIndex != 0 && beginIndex != index)
return false;
beginIndex = index + 1;
}
}
return true;
}
/// <summary>
/// 检测,区分大小写,“浦发银行”=="YH"/"YX"
/// </summary>
public static int HitTestSpellInt(string strOrigin, string strCompare)
{
string[][] arrStr = GetStringSpell(strOrigin);
if (strCompare.Length > strOrigin.Length) return ErrCode.Fail;
int index, beginIndex = 0;
int firstIndex = -1;
for (int i = 0; i < strCompare.Length; i++)
{
index = Find(arrStr, strCompare[i].ToString(), beginIndex);
if (index < 0)
{
return ErrCode.Fail;
}
else
{
if (firstIndex < 0) firstIndex = index;
beginIndex = index + 1;
}
}
return firstIndex;
}
private static int Find(string[][] arrStr, string chr, int beginIndex)
{
for (int i = beginIndex; i < arrStr.Length; i++)
{
if (ContainsChar(arrStr[i], chr))
{
return i;
}
}
return -1;
}
private static bool ContainsChar(string[] arrStr, string chr)
{
for (int i = 0; i < arrStr.Length; i++)
{
if (arrStr[i] == chr) return true;
}
return false;
}
/// <summary>
/// 返回字符串的拼音
/// </summary>
public static string[][] GetStringSpell(string str)
{
string[][] arrStr = new string[str.Length][];
for (int i = 0; i < str.Length; i++)
{
arrStr[i] = GetCharSpell(str[i]);
}
return arrStr;
}
/// <summary>
/// 返回字符的拼音
/// </summary>
public static string[] GetCharSpell(char chr)
{
int nchar = (int)chr;
if (nchar >= MinChar && nchar <= MaxChar)
{
string[] splitChars = Lines[nchar - MinChar].Split(' ');
string[] result = new string[splitChars.Length - 1];
for (int i = 1; i < splitChars.Length; i++)
{
result[i - 1] = splitChars[i];
}
return result;
}
else
{
//全角字母:A-Z
if (chr >= char_A_QuanJiao && chr <= char_Z_QuanJiao)
{
string[] result = new string[1];
result[0] = ((char)(char_A + (chr - char_A_QuanJiao))).ToString();
return result;
}
else
{
//不是汉字则直接返回该string
string[] result = new string[1];
result[0] = chr.ToString();
return result;
}
}
}
private const char char_A_QuanJiao = 'A';
private const char char_Z_QuanJiao = 'Z';
private const char char_A = 'A';
private const char char_Z = 'Z';
}


浙公网安备 33010602011771号