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

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

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

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

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

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

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

用法示例:

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

测试西里尔语:

 ///  /// 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". ///  [TestMethod] public void RussianAlphabetTest() { string russianAlphabetLowercase = "а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я"; string russianAlphabetUppercase = "А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я"; string expectedLowercase = "abvgde yo zh ziyklmnoprstuf kh ts ch sh shch \" y ' e yu ya"; string expectedUppercase = "ABVGDE Yo Zh ZIYKLMNOPRSTUF Kh Ts Ch Sh Shch \" Y ' E Yu Ya"; Assert.AreEqual(expectedLowercase, russianAlphabetLowercase.Unidecode()); Assert.AreEqual(expectedUppercase, russianAlphabetUppercase.Unidecode()); } 

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

  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; } 

为什么你不能只使用音译表并制作一个小的正则表达式或子程序?

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

对于未来的读者

Windows 7+可以通过其扩展语言服务实现此目的。 (您需要Windows API代码包才能从.NET执行此操作)

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

例:

 var latin = Transliteration.CyrillicToLatin( "Предками данная мудрость народная!", Language.Russian); Console.WriteLine(latin); // Output: Predkami dannaya mudrost` narodnaya! 

检查此代码:

 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 words = new Dictionary(); 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 pair in words) { source = source.Replace(pair.Key, pair.Value); } textBox2.Text = source; } } } 

哭到拉丁语:

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

拉丁到哭泣

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

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

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

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

 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; }