>  기사  >  백엔드 개발  >  C# 한자를 병음으로 변환(다음성 문자 지원)

C# 한자를 병음으로 변환(다음성 문자 지원)

黄舟
黄舟원래의
2017-02-06 16:46:282533검색

프로젝트 요구로 인해 한자를 병음으로 변환하고 쿼리를 위한 첫 번째 철자를 변환하는 기능이 필요했습니다. 이 기능이 기본적으로 성숙해졌다고 느껴서 관련 코드를 검색해 보니 첫 번째로 눈에 띄는 두 가지 기사가 있었습니다. 다음 두 기사

C# 한자를 병음으로 변환(GB2312 문자 집합의 모든 한자 지원) (http://www.cnblogs.com/cxd4321/p/4203383.html)

【상품】JS버전의 한자와 병음 간단한 JS병음 입력방식으로 상호변환을 위한 궁극의 솔루션 (http://www.cnblogs.com/liuxianan/p/pinyinjs.html)

포괄적이고 상세한 글을 쓴 두 블로거 덕분에 모두 소스 코드를 제공하므로 참조할 수 있습니다.

인터페이스의 필요로 인해 첫 번째 기사를 참조했습니다. 기사의 저자 소스 코드는 기본적으로 한자를 병음으로 변환하는 요구를 충족할 수 있으며, 다른 특수 문자도 추가할 수 있습니다. 보완점 모든 단점 다음성 쿼리를 지원해야 하기 때문에 나중에 다른 기사를 확인해보니 기성품이 없는 것으로 나타났습니다(제 검색 실력이 좋지 않은 것일 수도 있습니다).

나중에 검색해 보니 한자를 병음으로 변환하는 방법에 대해 마이크로소프트에서 제공하는 마이크로소프트 비주얼 스튜디오 인터내셔널 팩(Microsoft Visual Studio International Pack)이 아주 강력하다는 것을 알게 되었습니다. 그래서 시도해보았습니다

먼저 nuget에서 해당 패키지를 참조

하고 PinYinConverter

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)이라는 세 가지 다성 문자가 있습니다. 여기에는 발음 기호도 표시되어 있어 매우 편리합니다. 나에게 필요한 기능은 "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/PinYinParse

위는 C# 한자 병음 변환 내용입니다(다음성 문자 지원). PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.