You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
5.0 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Text;
namespace NPinyin
{
public static class Pinyin
{
/// <summary>
/// 取中文文本的拼音首字母
/// </summary>
/// <param name="text">编码为UTF8的文本</param>
/// <returns>返回中文对应的拼音首字母</returns>
public static string GetInitials(string text)
{
text = text.Trim();
StringBuilder chars = new StringBuilder();
for (var i = 0; i < text.Length; ++i)
{
string py = GetPinyin(text[i]);
if (py != "") chars.Append(py[0]);
}
return chars.ToString().ToUpper();
}
/// <summary>
/// 取中文文本的拼音首字母
/// </summary>
/// <param name="text">文本</param>
/// <param name="encoding">源文本的编码</param>
/// <returns>返回encoding编码类型中文对应的拼音首字母</returns>
public static string GetInitials(string text, Encoding encoding)
{
string temp = ConvertEncoding(text, encoding, Encoding.UTF8);
return ConvertEncoding(GetInitials(temp), Encoding.UTF8, encoding);
}
/// <summary>
/// 取中文文本的拼音
/// </summary>
/// <param name="text">编码为UTF8的文本</param>
/// <returns>返回中文文本的拼音</returns>
public static string GetPinyin(string text)
{
StringBuilder sbPinyin = new StringBuilder();
for (var i = 0; i < text.Length; ++i)
{
string py = GetPinyin(text[i]);
if (py != "") sbPinyin.Append(py);
sbPinyin.Append(" ");
}
return sbPinyin.ToString().Trim();
}
/// <summary>
/// 取中文文本的拼音
/// </summary>
/// <param name="text">编码为UTF8的文本</param>
/// <param name="encoding">源文本的编码</param>
/// <returns>返回encoding编码类型的中文文本的拼音</returns>
public static string GetPinyin(string text, Encoding encoding)
{
string temp = ConvertEncoding(text.Trim(), encoding, Encoding.UTF8);
return ConvertEncoding(GetPinyin(temp), Encoding.UTF8, encoding);
}
/// <summary>
/// 取和拼音相同的汉字列表
/// </summary>
/// <param name="pinyin">编码为UTF8的拼音</param>
/// <returns>取拼音相同的汉字列表如拼音“ai”将会返回“唉爱……”等</returns>
public static string GetChineseText(string pinyin)
{
string key = pinyin.Trim().ToLower();
foreach (string str in PyCode.codes)
{
if (str.StartsWith(key + " ") || str.StartsWith(key + ":"))
return str.Substring(7);
}
return "";
}
/// <summary>
/// 取和拼音相同的汉字列表编码同参数encoding
/// </summary>
/// <param name="pinyin">编码为encoding的拼音</param>
/// <param name="encoding">编码</param>
/// <returns>返回编码为encoding的拼音为pinyin的汉字列表如拼音“ai”将会返回“唉爱……”等</returns>
public static string GetChineseText(string pinyin, Encoding encoding)
{
string text = ConvertEncoding(pinyin, encoding, Encoding.UTF8);
return ConvertEncoding(GetChineseText(text), Encoding.UTF8, encoding);
}
/// <summary>
/// 返回单个字符的汉字拼音
/// </summary>
/// <param name="ch">编码为UTF8的中文字符</param>
/// <returns>ch对应的拼音</returns>
public static string GetPinyin(char ch)
{
short hash = GetHashIndex(ch);
for (var i = 0; i < PyHash.hashes[hash].Length; ++i)
{
short index = PyHash.hashes[hash][i];
var pos = PyCode.codes[index].IndexOf(ch, 7);
if (pos != -1)
return PyCode.codes[index].Substring(0, 6).Trim();
}
return ch.ToString();
}
/// <summary>
/// 返回单个字符的汉字拼音
/// </summary>
/// <param name="ch">编码为encoding的中文字符</param>
/// <returns>编码为encoding的ch对应的拼音</returns>
public static string GetPinyin(char ch, Encoding encoding)
{
ch = ConvertEncoding(ch.ToString(), encoding, Encoding.UTF8)[0];
return ConvertEncoding(GetPinyin(ch), Encoding.UTF8, encoding);
}
/// <summary>
/// 转换编码
/// </summary>
/// <param name="text">文本</param>
/// <param name="srcEncoding">源编码</param>
/// <param name="dstEncoding">目标编码</param>
/// <returns>目标编码文本</returns>
public static string ConvertEncoding(string text, Encoding srcEncoding, Encoding dstEncoding)
{
byte[] srcBytes = srcEncoding.GetBytes(text);
byte[] dstBytes = Encoding.Convert(srcEncoding, dstEncoding, srcBytes);
return dstEncoding.GetString(dstBytes);
}
/// <summary>
/// 取文本索引值
/// </summary>
/// <param name="ch">字符</param>
/// <returns>文本索引值</returns>
private static short GetHashIndex(char ch)
{
return (short)((uint)ch % PyCode.codes.Length);
}
}
}