C# 如何将西里尔文音译为拉丁文

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1841874/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 21:20:11  来源:igfitidea点击:

How to transliterate Cyrillic to Latin text

c#.nettransliteration

提问by ckknight

I have a method which turns any Latin text (e.g. English, French, German, Polish) into its slug form,

我有一种方法可以将任何拉丁文本(例如英语、法语、德语、波兰语)转换为其slug 形式,

e.g. Alpha Bravo Charlie=> alpha-bravo-charlie

例如Alpha Bravo Charlie=>alpha-bravo-charlie

But it can't work for Cyrillic text (e.g. Russian), so what I'm wanting to do is transliterate the Cyrillic text to Latin characters, then slugify that.

但它不能用于西里尔文文本(例如俄语),所以我想要做的是将西里尔文文本音译为拉丁字符,然后对其进行 slugify。

Does anyone have a way to do such transliteration? Whether by actual source or a library.

有没有人有办法做这样的音译?无论是通过实际来源还是图书馆。

I'm coding in C#, so a .NET library will work. Alternatively, if you have non-C# code, I'm sure I could convert it.

我在 C# 中编码,所以 .NET 库可以工作。或者,如果您有非 C# 代码,我相信我可以转换它。

采纳答案by Dima Stefantsov

You can use .NET open source dll library UnidecodeSharpForkto transliterate Cyrillic and many more languages to Latin.

您可以使用 .NET 开源 dll 库UnidecodeSharpFork将西里尔文和更多语言音译为拉丁文。

Example usage:

用法示例:

Assert.AreEqual("Rabota s kirillitsey", "Работа с кириллицей".Unidecode());
Assert.AreEqual("CZSczs", "??????".Unidecode());
Assert.AreEqual("Hello, World!", "Hello, World!".Unidecode());

Testing Cyrillic:

测试西里尔字母:

/// <summary>
/// According to http://en.wikipedia.org/wiki/Romanization_of_Russian BGN/PCGN.
/// http://en.wikipedia.org/wiki/BGN/PCGN_romanization_of_Russian
/// With converting "ё" to "yo".
/// </summary>
[TestMethod]
public void RussianAlphabetTest()
{
    string russianAlphabetLowercase = "а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я";
    string russianAlphabetUppercase = "А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я";

    string expectedLowercase = "a b v g d e yo zh z i y k l m n o p r s t u f kh ts ch sh shch \" y ' e yu ya";
    string expectedUppercase = "A B V G D E Yo Zh Z I Y K L M N O P R S T U F Kh Ts Ch Sh Shch \" Y ' E Yu Ya";

    Assert.AreEqual(expectedLowercase, russianAlphabetLowercase.Unidecode());
    Assert.AreEqual(expectedUppercase, russianAlphabetUppercase.Unidecode());
}

Simple, fast and powerful. And it's easy to extend/modify transliteration table if you want to.

简单、快速且功能强大。如果您愿意,可以轻松扩展/修改音译表。

回答by jball

Microsoft has a transliteration tool which includes a DLL you could hook into (you would need to check licensing restrictions if you're going to use it non-personally). You can read more about it in Dejan Vesi?'s blog post

Microsoft 有一个音译工具,其中包含一个可以挂钩的 DLL(如果您要非个人使用,则需要检查许可限制)。您可以在Dejan Vesi? 的博客文章中阅读更多相关信息

回答by Max Galkin

Why can't you just take a transliteration tableand make a small regex or subroutine?

为什么不能拿一个音译表做一个小的正则表达式或子程序?

回答by Pritesh

Use this method Just pass your Cyrillic word contain string and this method return Latin English string corresponding to Cyrillic string.

使用此方法只需传递您的西里尔文单词包含字符串,此方法返回与西里尔文字符串对应的拉丁英文字符串。

public static string GetLatinCodeFromCyrillic(string str)
    {

        str = str.Replace("б", "b");
        str = str.Replace("Б", "B");

        str = str.Replace("в", "v");
        str = str.Replace("В", "V");

        str = str.Replace("г", "h");
        str = str.Replace("Г", "H");

        str = str.Replace("?", "g");
        str = str.Replace("?", "G");

        str = str.Replace("д", "d");
        str = str.Replace("Д", "D");

        str = str.Replace("?", "ye");
        str = str.Replace("Э", "Ye");

        str = str.Replace("ж", "zh");
        str = str.Replace("Ж", "Zh");

        str = str.Replace("з", "z");
        str = str.Replace("З", "Z");

        str = str.Replace("и", "y");
        str = str.Replace("И", "Y");

        str = str.Replace("?", "yi");
        str = str.Replace("?", "YI");

        str = str.Replace("й", "j");
        str = str.Replace("Й", "J");

        str = str.Replace("к", "k");
        str = str.Replace("К", "K");

        str = str.Replace("л", "l");
        str = str.Replace("Л", "L");

        str = str.Replace("м", "m");
        str = str.Replace("М", "M");

        str = str.Replace("н", "n");
        str = str.Replace("Н", "N");

        str = str.Replace("п", "p");
        str = str.Replace("П", "P");

        str = str.Replace("р", "r");
        str = str.Replace("Р", "R");

        str = str.Replace("с", "s");
        str = str.Replace("С", "S");

        str = str.Replace("ч", "ch");
        str = str.Replace("Ч", "CH");

        str = str.Replace("ш", "sh");
        str = str.Replace("Щ", "SHH");

        str = str.Replace("ю", "yu");
        str = str.Replace("Ю", "YU");

        str = str.Replace("Я", "YA");
        str = str.Replace("я", "ya");

        str = str.Replace('ь', '"');
        str = str.Replace("Ь", "");

        str = str.Replace('т', 't');
        str = str.Replace("Т", "T");

        str = str.Replace('ц', 'c');
        str = str.Replace("Ц", "C");

        str = str.Replace('о', 'o');
        str = str.Replace("О", "O");

        str = str.Replace('е', 'e');
        str = str.Replace("Е", "E");

        str = str.Replace('а', 'a');
        str = str.Replace("А", "A");

        str = str.Replace('ф', 'f');
        str = str.Replace("Ф", "F");

        str = str.Replace('?', 'i');
        str = str.Replace("?", "I");

        str = str.Replace('У', 'U');
        str = str.Replace("у", "u");

        str = str.Replace('х', 'x');
        str = str.Replace("Х", "X");
        return str;
    }

回答by Arithmomaniac

For future readers

对于未来的读者

Windows 7+ can do this with its Extended Linguistic Services. (You'll need the Windows API Code Packto do it from .NET)

Windows 7+ 可以通过它的扩展语言服务来做到这一点。(您需要Windows API 代码包才能从 .NET 执行此操作)

回答by Romkar

    public static string Translit(string str)
    {
        string[] lat_up = {"A", "B", "V", "G", "D", "E", "Yo", "Zh", "Z", "I", "Y", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "Kh", "Ts", "Ch", "Sh", "Shch", "\"", "Y", "'", "E", "Yu", "Ya"};
        string[] lat_low = {"a", "b", "v", "g", "d", "e", "yo", "zh", "z", "i", "y", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "kh", "ts", "ch", "sh", "shch", "\"", "y", "'", "e", "yu", "ya"};
        string[] rus_up = {"А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я"};
        string[] rus_low = { "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"};
        for (int i = 0; i <= 32; i++)
        {
            str = str.Replace(rus_up[i],lat_up[i]);
            str = str.Replace(rus_low[i],lat_low[i]);              
        }
        return str;
    }

回答by Sarvar Nishonboev

Check this code:

检查此代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Transliter
{
    public partial class Form1 : Form
    {
        Dictionary<string, string> words = new Dictionary<string, string>();

        public Form1()
        {
            InitializeComponent();
            words.Add("а", "a");
            words.Add("б", "b");
            words.Add("в", "v");
            words.Add("г", "g");
            words.Add("д", "d");
            words.Add("е", "e");
            words.Add("ё", "yo");
            words.Add("ж", "zh");
            words.Add("з", "z");
            words.Add("и", "i");
            words.Add("й", "j");
            words.Add("к", "k");
            words.Add("л", "l");
            words.Add("м", "m");
            words.Add("н", "n");
            words.Add("о", "o");
            words.Add("п", "p");
            words.Add("р", "r");
            words.Add("с", "s");
            words.Add("т", "t");
            words.Add("у", "u");
            words.Add("ф", "f");
            words.Add("х", "h");
            words.Add("ц", "c");
            words.Add("ч", "ch");
            words.Add("ш", "sh");
            words.Add("щ", "sch");
            words.Add("ъ", "j");
            words.Add("ы", "i");
            words.Add("ь", "j");
            words.Add("э", "e");
            words.Add("ю", "yu");
            words.Add("я", "ya");
            words.Add("А", "A");
            words.Add("Б", "B");
            words.Add("В", "V");
            words.Add("Г", "G");
            words.Add("Д", "D");
            words.Add("Е", "E");
            words.Add("Ё", "Yo");
            words.Add("Ж", "Zh");
            words.Add("З", "Z");
            words.Add("И", "I");
            words.Add("Й", "J");
            words.Add("К", "K");
            words.Add("Л", "L");
            words.Add("М", "M");
            words.Add("Н", "N");
            words.Add("О", "O");
            words.Add("П", "P");
            words.Add("Р", "R");
            words.Add("С", "S");
            words.Add("Т", "T");
            words.Add("У", "U");
            words.Add("Ф", "F");
            words.Add("Х", "H");
            words.Add("Ц", "C");
            words.Add("Ч", "Ch");
            words.Add("Ш", "Sh");
            words.Add("Щ", "Sch");
            words.Add("Ъ", "J");
            words.Add("Ы", "I");
            words.Add("Ь", "J");
            words.Add("Э", "E");
            words.Add("Ю", "Yu");
            words.Add("Я", "Ya");
    }

        private void button1_Click(object sender, EventArgs e)
        {
            string source = textBox1.Text;
            foreach (KeyValuePair<string, string> pair in words)
            {
                source = source.Replace(pair.Key, pair.Value);
            }
            textBox2.Text = source;
        }
    }
}

cryllic to latin:

Cryllic 到拉丁语:

text.Replace(pair.Key, pair.Value); 

latin to cryllic

拉丁语到克里尔克语

source.Replace(pair.Value,pair.Key);

回答by Nick Buhro

You can use my library for transliteration: https://github.com/nick-buhro/Translit
It is also available on NuGet.

您可以使用我的库进行音译:https: //github.com/nick-buhro/Translit
也可以在NuGet 上找到

Example:

例子:

var latin = Transliteration.CyrillicToLatin(
    "Предками данная мудрость народная!", 
    Language.Russian);

Console.WriteLine(latin);   
// Output: Predkami dannaya mudrost` narodnaya!

回答by Zhivko Kabaivanov

Here is a great articlethat describes how to make a C# equivalent of thisJavaScript one.

这是一篇很棒的文章,它描述了如何使 C# 与JavaScript等效。

string result = DisplayInEnglish("Олъга Виктровна Василенко");

回答by Schnapz

Optimized the answer of Sarvar Nishonboev, seems like a simplest solution without unnecessary complexity related to the re-creating of string at each iteration:

优化了Sarvar Nishonboev的答案,似乎是一个最简单的解决方案,没有与每次迭代重新创建字符串相关的不必要的复杂性:

public static class Converter
{
    private static readonly Dictionary<char, string> ConvertedLetters = new Dictionary<char, string>
    {
        {'а', "a"},
        {'б', "b"},
        {'в', "v"},
        {'г', "g"},
        {'д', "d"},
        {'е', "e"},
        {'ё', "yo"},
        {'ж', "zh"},
        {'з', "z"},
        {'и', "i"},
        {'й', "j"},
        {'к', "k"},
        {'л', "l"},
        {'м', "m"},
        {'н', "n"},
        {'о', "o"},
        {'п', "p"},
        {'р', "r"},
        {'с', "s"},
        {'т', "t"},
        {'у', "u"},
        {'ф', "f"},
        {'х', "h"},
        {'ц', "c"},
        {'ч', "ch"},
        {'ш', "sh"},
        {'щ', "sch"},
        {'ъ', "j"},
        {'ы', "i"},
        {'ь', "j"},
        {'э', "e"},
        {'ю', "yu"},
        {'я', "ya"},
        {'А', "A"},
        {'Б', "B"},
        {'В', "V"},
        {'Г', "G"},
        {'Д', "D"},
        {'Е', "E"},
        {'Ё', "Yo"},
        {'Ж', "Zh"},
        {'З', "Z"},
        {'И', "I"},
        {'Й', "J"},
        {'К', "K"},
        {'Л', "L"},
        {'М', "M"},
        {'Н', "N"},
        {'О', "O"},
        {'П', "P"},
        {'Р', "R"},
        {'С', "S"},
        {'Т', "T"},
        {'У', "U"},
        {'Ф', "F"},
        {'Х', "H"},
        {'Ц', "C"},
        {'Ч', "Ch"},
        {'Ш', "Sh"},
        {'Щ', "Sch"},
        {'Ъ', "J"},
        {'Ы', "I"},
        {'Ь', "J"},
        {'Э', "E"},
        {'Ю', "Yu"},
        {'Я', "Ya"}
    };

    public static string ConvertToLatin(string source)
    {
        var result = new StringBuilder();
        foreach (var letter in source)
        {
            result.Append(ConvertedLetters[letter]);
        }
        return result.ToString();
    }
}

Use it like this:

像这样使用它:

Converter.ConvertToLatin("Проверочный текст");