2009-12-03 5 views
14

Ich habe eine Methode, die mit lateinischem Text wird (zum Beispiel Englisch, Französisch, Deutsch, Polnisch) in seine Klumpenform,Wie transkribieren Kyrillisch zu lateinischem Text

z.B.

Aber es kann nicht für kyrillischen Text (z. B. Russisch) arbeiten, also was ich tun möchte ist, den kyrillischen Text in lateinische Zeichen zu transkribieren, dann slugify das.

Hat jemand eine Möglichkeit, solche Transliteration zu tun? Ob durch tatsächliche Quelle oder eine Bibliothek.

Ich bin in C# codieren, damit eine .NET-Bibliothek funktioniert. Alternativ, wenn Sie nicht-C# -Code haben, bin ich sicher, dass ich es konvertieren könnte.

Antwort

16

können Sie .NET verwenden Open-Source-DLL-Bibliothek UnidecodeSharpFork Kyrillisch zu transkribieren und viele weitere Sprachen auf Latein.

Beispiel Nutzung:

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

Testing Kyrillisch:

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

Einfach, schnell und leistungsstark. Und es ist einfach, die Transliterationstabelle zu erweitern/zu ändern, wenn Sie möchten.

+3

Falsch. Dies transkribiert Анастасия als Anastasiya, und nicht Anastasia. Das sieht schrecklich aus. Scheint so, als ob dieses Dokument (http://en.wikipedia.org/wiki/BGN/PCGN_Romanisation_of_Russian) in den speziellen Bestimmungen falsch ist. Darüber hinaus berücksichtigen Sie nicht die speziellen Bestimmungen, und UnidecodeSharpFork transkribierte deutsche Umlaute (äöüÄÖÜ) als aouAOU anstelle von ae oee Ae Oe Ue. Dies ist der Grund, warum ich von Upvote zu Downvote gewechselt habe. Wenn Sie eine Romanisierungsbibliothek (oder einen Algorithmus) erstellen, tun Sie dies richtig oder geben Sie anderweitig an, dass Ihr Algorithmus unvollständig/fehlerhaft und nicht produktionsbereit ist. –

+1

Und ein weiterer Fehler: Ольга -> Ol'ga, Татьяна -> Tat'yana, etc. ... –

+0

Ich verwende diese Abhilfe: 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"); // Rückgabe this.Name.Unidecode(); Rückkehr str; –

4

Microsoft verfügt über ein Transliterationswerkzeug, das eine DLL enthält, in die Sie sich einklinken können (Sie müssen die Lizenzbeschränkungen überprüfen, wenn Sie es nicht persönlich verwenden). Sie können mehr über sie in Dejan Vesić's blog post

8

Warum lesen Sie nicht einfach eine transliteration table nehmen und eine kleine regex oder Unterprogramm machen?

+0

Nun ... kann sich als einfacher erweisen, als ich dachte. Werde es versuchen, danke. – Veverke

0

Verwenden Sie diese Methode Geben Sie einfach Ihr kyrillisches Wort contain string und diese Methode gibt die lateinische englische Zeichenfolge zurück, die der kyrillischen Zeichenfolge entspricht.

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

Sie haben eine falsche Transliterationstabelle, z. 'г' wird niemals durch' h' ersetzt, 'è' durch' y' und so weiter. –

+4

O_O ... Das ist O (66n). – Triang3l

+0

Go lernen Russisch -1 –

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

Lets create 66 * (Anzahl der Zeichen) Strings ... schön. – hazzik

3

überprüfen diesen 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 auf lateinisch:

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

lateinisch cryllic

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

Lets create 66 * (Anzahl der Zeichen) Strings ... nett. – hazzik

4

Sie können meine Bibliothek für die Übersetzung verwenden teration: https://github.com/nick-buhro/Translit
Es ist auch verfügbar unter NuGet.

Beispiel:

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

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

Hier ist ein großes article, die beschreibt, wie ein C# -Äquivalent von this JavaScript zu machen.

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