我有將任何拉丁文字(例如英語,法語,德語,波蘭語)到其塞形式的方法,如何音譯西里爾以拉丁文字
例如Alpha Bravo Charlie
=>alpha-bravo-charlie
但它不能用於西里爾語的文本(例如俄語),所以我想要做的是將西里爾語文本音譯爲拉丁字符,然後將其拼音化。
有沒有人有辦法做這種音譯?無論是由實際來源還是由圖書館。
我使用C#進行編碼,因此.NET庫將起作用。或者,如果您有非C#代碼,我相信我可以將其轉換。
我有將任何拉丁文字(例如英語,法語,德語,波蘭語)到其塞形式的方法,如何音譯西里爾以拉丁文字
例如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());
測試西里爾:
/// <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());
}
簡單,快速和強大。如果您願意,可以很容易地擴展/修改音譯表。
微軟有一個音譯工具,它包括一個你可以掛鉤的DLL(如果你打算非個人使用它,你需要檢查授權限制)。你可以閱讀更多關於它Dejan Vesić's blog post
爲什麼你不能只是拿一個transliteration table並做出一個小的正則表達式或子例程?
呃......可能會比我想象的要簡單。會嘗試,謝謝。 – Veverke 2015-09-21 17:26:21
使用此方法只需傳遞您的西里爾字包含字符串,並且此方法返回對應於西里爾字符串的拉丁英語字符串。
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;
}
您有錯誤的音譯表,例如'г'永遠不會被'h',''和'y'等替代。 – 2012-04-27 12:12:45
O_O ...這是O(66n)。 – Triang3l 2012-11-17 16:47:30
去學俄語-1 – 2014-08-11 16:57:04
對於未來的讀者
的Windows 7+可以用它Extended Linguistic Services做到這一點。 (您將需要Windows API Code Pack從.NET做)
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;
}
讓我們創建66 *(字符數)字符串...很好。 – hazzik 2015-01-24 09:49:14
檢查這個代碼:
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);
讓我們創建66 *(字符數)字符串...很好。 – hazzik 2015-01-24 09:50:04
您可以使用我的圖書館進行transli teration:https://github.com/nick-buhro/Translit
它也可在NuGet。
例子:
var latin = Transliteration.CyrillicToLatin(
"Предками данная мудрость народная!",
Language.Russian);
Console.WriteLine(latin);
// Output: Predkami dannaya mudrost` narodnaya!
錯了。這音譯作爲阿納斯塔西婭,而不是阿納斯塔西婭。這看起來很可怕。似乎這個文件(http://en.wikipedia.org/wiki/BGN/PCGN_romanization_of_Russian)在特殊條款中是錯誤的。此外,您不需要考慮特殊條款,UnidecodeSharpFork將德語變音(音樂)音譯爲音樂,而不是通過Ae Oe Ue音譯。這就是我從Upvote變爲downvote的原因。如果你做了一個羅馬化庫(或算法),正確地做,或者說,你的算法是不完整的/越野車,並沒有準備好生產。 – 2012-12-25 13:12:02
另一個bug:Ольга - > Ol'ga,Татьяна - > Tat'yana等... – 2012-12-25 13:34:32
我使用此解決方法: 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