2009-12-03 134 views
14

我有将任何拉丁文字(例如英语,法语,德语,波兰语)到其塞形式的方法,如何音译西里尔以拉丁文字

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

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

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

我使用C#进行编码,因此.NET库将起作用。或者,如果您有非C#代码,我相信我可以将其转换。

回答

16

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

用法示例:

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

测试西里尔:

/// <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()); 
} 

简单,快速和强大。如果您愿意,可以很容易地扩展/修改音译表。

+3

错了。这音译作为阿纳斯塔西娅,而不是阿纳斯塔西娅。这看起来很可怕。似乎这个文件(http://en.wikipedia.org/wiki/BGN/PCGN_romanization_of_Russian)在特殊条款中是错误的。此外,您不需要考虑特殊条款,UnidecodeSharpFork将德语变音(音乐)音译为音乐,而不是通过Ae Oe Ue音译。这就是我从Upvote变为downvote的原因。如果你做了一个罗马化库(或算法),正确地做,或者说,你的算法是不完整的/越野车,并没有准备好生产。 – 2012-12-25 13:12:02

+1

另一个bug:Ольга - > Ol'ga,Татьяна - > Tat'yana等... – 2012-12-25 13:34:32

+0

我使用此解决方法: string str = this.Name.Replace(“ь”,“”); str = str.Replace(“ä”,“ae”); str = str.Replace(“ö”,“oe”); str = str.Replace(“ü”,“ue”); str = str.Replace(“Ä”,“Ae”); str = str.Replace(“Ö”,“Oe”); str = str.Replace(“Ü”,“Ue”); str = UnidecodeSharpFork.Unidecoder.Unidecode(str); // str = str.Replace(“Anastasiya”,“Anastasia”); str = str.Replace(“iy”,“i”); // return this.Name.Unidecode(); return str; – 2012-12-25 13:46:53

4

微软有一个音译工具,它包括一个你可以挂钩的DLL(如果你打算非个人使用它,你需要检查授权限制)。你可以阅读更多关于它Dejan Vesić's blog post

8

为什么你不能只是拿一个transliteration table并做出一个小的正则表达式或子例程?

+0

呃......可能会比我想象的要简单。会尝试,谢谢。 – Veverke 2015-09-21 17:26:21

0

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

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

您有错误的音译表,例如'г'永远不会被'h',''和'y'等替代。 – 2012-04-27 12:12:45

+4

O_O ...这是O(66n)。 – Triang3l 2012-11-17 16:47:30

+0

去学俄语-1 – 2014-08-11 16:57:04

12
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; 
    } 
+3

让我们创建66 *(字符数)字符串...很好。 – hazzik 2015-01-24 09:49:14

3

检查这个代码:

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拉丁文:

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

拉丁语cryllic

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

让我们创建66 *(字符数)字符串...很好。 – hazzik 2015-01-24 09:50:04

4

您可以使用我的图书馆进行transli teration:https://github.com/nick-buhro/Translit
它也可在NuGet

例子:

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

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

这里是一个伟大article介绍如何做一个C#相当于this的JavaScript之一。

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