2009-12-03 35 views
14

tengo un método que convierte cualquier texto en latín (por ejemplo, Inglés, Francés, Alemán, Polaco) en su forma de bala,Cómo transcribir cirílico al latín texto

por ejemplo, Alpha Bravo Charlie =>alpha-bravo-charlie

Pero no puede funcionar para texto cirílico (por ejemplo, ruso), así que lo que quiero hacer es transcribir el texto cirílico a caracteres latinos, y luego slugify.

¿Alguien tiene una manera de hacer tal transliteración? Ya sea por fuente real o una biblioteca.

Estoy codificando en C#, por lo que una biblioteca .NET funcionará. Alternativamente, si tiene un código que no es de C#, estoy seguro de que podría convertirlo.

Respuesta

16

Puede utilizar .NET biblioteca DLL de código abierto UnidecodeSharpFork transliterar cirílico y muchos más idiomas a América.

Ejemplo de uso:

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

Prueba cirílico:

/// <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, rápido y potente. Y es fácil ampliar/modificar la tabla de transliteración si lo desea.

+3

Incorrecto. Esto transcribe a Анастасия como Anastasiya, y no a Anastasia. Esto se ve horrible. Parece que este documento (http://en.wikipedia.org/wiki/BGN/PCGN_romanization_of_Russian) está mal en las disposiciones especiales. Además, no se tienen en cuenta las disposiciones especiales, y UnidecodeSharpFork transliterated German Umlauts (äöüÄÖÜ) como aouAOU en lugar de ae aeue Ae Oe Ue. Esta es la razón por la que cambié de Upvote a downvote. Si realiza una biblioteca de romanización (o algoritmo), hágalo correctamente o establezca de otra manera que su algoritmo está incompleto/con errores y no está listo para la producción. –

+1

Y otro error: Ольга -> Ol'ga, Татьяна -> Tat'yana, etc. ... –

+0

Yo uso esta solución: 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"); // devuelve this.Name.Unidecode(); return str; –

4

Microsoft tiene una herramienta de transliteración que incluye un archivo DLL que puede enganchar (deberá comprobar las restricciones de licencia si va a utilizarlo de forma no personal). Puede leer más al respecto en Dejan Vesić's blog post

8

¿Por qué no puede simplemente tomar un transliteration table y hacer una pequeña expresión regular o una subrutina?

+0

Bueno ... puede ser más simple de lo que pensaba. Lo intentaré, gracias. – Veverke

0

Utilice este método Simplemente pase su palabra cirílica que contiene una cadena y este método devuelve la cadena en inglés latino correspondiente a una cuerda cirílica.

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

Tiene una tabla de transliteración incorrecta, p. 'г' nunca se sustituye por' h', 'и' por' y' y así sucesivamente. –

+4

O_O ... Esto es O (66n). – Triang3l

+0

Ir a aprender ruso -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

Permite crear 66 * (número de caracteres) cadenas ... bien. – hazzik

3

Comprobar este código:

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 al latín:

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

latino a cryllic

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

Permite crear 66 * (número de caracteres) cadenas ... bien. – hazzik

4

Puede usar mi biblioteca para transli teration: https://github.com/nick-buhro/Translit
También está disponible en NuGet.

Ejemplo:

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

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

Aquí hay una gran article que describe cómo hacer un equivalente C# de this JavaScript uno.

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