ホームページ  >  記事  >  バックエンド開発  >  C# 中国語の文字をピンインに変換します (複数の音声文字をサポート)

C# 中国語の文字をピンインに変換します (複数の音声文字をサポート)

黄舟
黄舟オリジナル
2017-02-06 16:46:282520ブラウズ

プロジェクトのニーズにより、クエリ用に中国語の文字をピンインと最初のスペルに変換する機能が必要になったので、この機能が基本的に成熟していると感じたので、最初に目に留まった記事は次の 2 つでした。記事

C# 中国語の文字をピンインに変換する (GB2312 文字セットのすべての中国語文字をサポート) (http://www.cnblogs.com/cxd4321/p/4203383.html)

【グッズ】中国語を変換するための究極のソリューションシンプルな JS ピンイン入力メソッド (http://www.cnblogs.com/liuxianan/p/pinyinjs.html) を使用して、文字を JS バージョンのピンインに変換します

2 人のブロガーのおかげで、文章は包括的かつ詳細であり、ソースもコードが提供されていますので参照できます。

インターフェースが必要なため、記事内の著者のソースコードは基本的に中国語の文字をピンインに変換するニーズを満たすことができますが、その他の特殊文字についても追加および補完できます。複数のふりがなをサポートしていないことです。ふりがなについては、複数のふりがな文字のクエリをサポートする必要があるため、後で他の記事を確認したところ、既製の記事がないことがわかりました(私の検索スキルが低い可能性があります)。

後で調べてみると、中国語の文字をピンインに変換するには、Microsoft が Microsoft Visual Studio International Pack を提供しており、非常に強力であることがわかりました。それで試してみました

まずnugetの対応するパッケージを参照します

PinyingConverterを見つけます

C# 中国語の文字をピンインに変換します (複数の音声文字をサポート)

簡単なデモです

使い方はとても簡単で、 ChineseChar クラスを直接使用して置き換えるだけです

string ch = Console.ReadLine();
ChineseChar cc = new ChineseChar(ch[0]);
var pinyins = cc.Pinyins.ToList();
pinyins.ForEach(Console.WriteLine);

結果は次のようになります。

C# 中国語の文字をピンインに変換します (複数の音声文字をサポート)

「行」には「hang、heng、xing」という 3 つの多声文字があることがわかります。ここには発音記号も表示されており、非常に便利です。必要な機能は、「bank」と入力し、それを「yinhang、yinheng、yinxing」としてピンインに変換することです。最初のピンインは「yh、yx」です。 ChineseChar クラスの考え方は簡単です。

中国語の文字をピンインに変換するパッケージ

1. まず、入力された中国語の文字を分割します

2.次に、 ChineseChar を使用して、各中国語の文字に対して複数のピンインを取得します

3. 次に、数字を削除し、重複を削除し、最初の文字を抽出します。それを組み合わせるだけです

そこで、それを置き換えるヘルパークラスを書きました。コードは次のとおりです:

public class PinYinConverterHelp
    {
        public static PingYinModel GetTotalPingYin(string str)
        {
            var chs = str.ToCharArray();
            //记录每个汉字的全拼
            Dictionary<int, List<string>> totalPingYins = new Dictionary<int, List<string>>();
            for (int i = 0; i < chs.Length; i++)
            {
                var pinyins = new List<string>();
                var ch = chs[i];
                //是否是有效的汉字
                if (ChineseChar.IsValidChar(ch))
                {
                    ChineseChar cc = new ChineseChar(ch);
                    pinyins = cc.Pinyins.Where(p => !string.IsNullOrWhiteSpace(p)).ToList();
                }
                else
                {
                    pinyins.Add(ch.ToString());
                }
                //去除声调,转小写
                pinyins = pinyins.ConvertAll(p => Regex.Replace(p, @"\d", "").ToLower());
                //去重
                pinyins = pinyins.Where(p => !string.IsNullOrWhiteSpace(p)).Distinct().ToList();
                if (pinyins.Any())
                {
                    totalPingYins[i] = pinyins;
                }
            }
            PingYinModel result = new PingYinModel();
            foreach (var pinyins in totalPingYins)
            {
                var items = pinyins.Value;
                if (result.TotalPingYin.Count <= 0)
                {
                    result.TotalPingYin = items;
                    result.FirstPingYin = items.ConvertAll(p => p.Substring(0, 1)).Distinct().ToList();
                }
                else
                {
                    //全拼循环匹配
                    var newTotalPingYins = new List<string>();
                    foreach (var totalPingYin in result.TotalPingYin)
                    {
                        newTotalPingYins.AddRange(items.Select(item => totalPingYin + item));
                    }
                    newTotalPingYins = newTotalPingYins.Distinct().ToList();
                    result.TotalPingYin = newTotalPingYins;

                    //首字母循环匹配
                    var newFirstPingYins = new List<string>();
                    foreach (var firstPingYin in result.FirstPingYin)
                    {
                        newFirstPingYins.AddRange(items.Select(item => firstPingYin + item.Substring(0, 1)));
                    }
                    newFirstPingYins = newFirstPingYins.Distinct().ToList();
                    result.FirstPingYin = newFirstPingYins;
                }
            }
            return result;
        }
    }

結果:

C# 中国語の文字をピンインに変換します (複数の音声文字をサポート)

現時点では、いくつかの珍しい単語を試しましたが、それらはすべてサポートされています。あまりにも偏りのあるものは試していませんが、一般的な中国語の文字をピンインに変換するには、ここで多発音文字をサポートするだけで十分です。


ここでは、Microsoft Visual Studio International Pack 拡張パッケージの中国語文字変換機能を使用するだけです。実際には、中国語、日本語、韓国語、英語、その他の国向けの言語パッケージもあり、相互変換を実現するためのメソッドが提供されています。変換、取得、単語数の取得、画数の取得など強力な機能を持っていますので、興味のある方はご自身で API を確認してみてください。


ソースコードの共有


共有は美徳である場合もありますが、素晴らしい記事が技術レベルを向上させることもありますが、ビジネスレベルでより多くのニーズがあり、多くの小さなナレッジアプリケーションを共有することがビジネスの向上に役立ちます。 -レベルの問題。共有する知識が役に立ち、他人に誤解を与えない限り、その規模の大小に関わらず、それは一種の学びですので、皆さんもぜひ勇気を出して共有していただければと思います。

アドレス: https://github.com/qq1206676756/PinyingParse

上記は、C# の中国語文字をピンインに変換した内容です (多発音文字をサポートしています)。その他の関連コンテンツについては、PHP 中国語 Web サイト ( www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。