2010-06-20 12 views
7

¿Es posible convertir cuerda cirílica al inglés (latín) en C#? Por ejemplo, necesito convertir "Петролеум" en "Petróleo". Además, olvidé mencionar que si tengo una cuerda cirílica, necesito permanecer así, ¿puedo verificarlo de alguna manera?¿Cómo puedo convertir cuerda cirílica al inglés en C#

+2

Hey, acabo de enterar de algo, que podría ser importante para usted también. Si está transcribiendo texto oficial (como direcciones de clientes publicitarios o lo que sea), debe verificar si existe una ley especial para la transliteración con una tabla de transliteración incluida. Bulgaria, por ejemplo, tiene una ley así y cualquier uso indebido podría generar problemas legales. Además de la tabla, se pueden describir excepciones de la regla, que también debe seguir. Como България es Bulgaria, no Balgariya. – vlood

Respuesta

7

No estoy familiarizado con el cirílico, pero si se trata de un mapeo 1 a 1 de caracteres cirílicos a caracteres latinos que está buscando, puede usar un diccionario de pares de caracteres y asignar cada carácter individualmente:

var map = new Dictionary<char, string> 
{ 
    { 'П', "P" }, 
    { 'е', "e" }, 
    { 'т', "t" }, 
    { 'р', "r" }, 
    ... 
} 

var result = string.Concat("Петролеум".Select(c => map[c])); 
+0

Estaba tratando de evitar eso, pero gracias :) Pensé que si había alguna forma más limpia de .Net o C#. – Pece

+0

@Pece: no conozco un método incorporado que lo haga ... Por cierto, si el rendimiento es una preocupación, utilice un char [] o StringBuilder en lugar de LINQ. – dtb

+4

No es un mapa de ch a ch. Necesita caracteres latinos múltiples para algunos caracteres cirílicos. – PauliL

3

Puede, por supuesto, mapear las letras de la transcripción latina, pero en la mayoría de los casos no obtendrá una palabra en inglés. P.ej. Российская Федерация transcribe a Rossiyskaya Federatsiya. wikipedia ofrece una descripción general de la asignación. Probablemente estés buscando un servicio de traducción, google probablemente ofrece una API para eso.

0

Utilice un diccionario con palabras en inglés y ruso como una tabla de búsqueda. Va a ser una gran cantidad de tipeo para construirlo, pero es una prueba completa.

+3

realmente no. Si Google no puede producir un diccionario infalible, tampoco puede. – Femaref

0

¿Por qué quieres hacer esto? Cambiar caracteres uno a uno generalmente no produce una transliteración razonable, y mucho menos una traducción. Puede encontrar que la publicación this es de su interés.

0

Está buscando una forma de translutinar palabras rusas escritas en cirílico (en algunas codificaciones, por ejemplo, incluso una codificación en latín, ya que iso 8859-5 también es Latin-5 en cirílico) en alfabeto latino (con acentos)?

No sé si .NET tiene algo que transcribir, pero me atrevo a decir que (como muchos otros buenos marcos) no lo tiene. Este enlace wikipedista podría brindarle algunas ideas para implementar translitteration, pero no es la única manera y recuerda que los sistemas de escritura cirílica no son utilizados solo por el ruso y la forma en que aplica la transliteración puede variar en el idioma que usa el sistema de escritura. P.ej. see the same for bulgarian. May this link (siempre desde wp) puede ser también interesante si quiere programar el translitterator usted mismo.

2

http://code.google.com/apis/ajaxlanguage/documentation/#Transliteration

Google ofrece este servicio de transliteración basada en AJAX. De esta forma, puede evitar computar las transliteraciones usted mismo y dejar que Google las haga sobre la marcha. Significaría permitir que el cliente haga la solicitud a Google, por lo que su aplicación necesitaría tener algún tipo de salida basada en web para que esta solución funcione.

3

Si está utilizando Windows 7, puede aprovechar la nueva API ELS (Servicios Lingüísticos Extendidos), que le proporciona la funcionalidad de transliteración. Eche un vistazo a Windows 7 API Code Pack - es un conjunto de contenedores administrados además de muchas nuevas API en Windows 7 (como la nueva barra de tareas). Buscar en la carpeta Samples para el ejemplo Transliterator, usted encontrará que es exactamente lo que está buscando:

2

Puede utilizar text.Replace(pair.Key, pair.Value) función.

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

Si cambia

cryllic al latín:

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

latino a cryllic

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

Este método es muy rápido:

static string[] CyrilicToLatinL = 
    "a,b,v,g,d,e,zh,z,i,j,k,l,m,n,o,p,r,s,t,u,f,kh,c,ch,sh,sch,j,y,j,e,yu,ya".Split(','); 
static string[] CyrilicToLatinU = 
    "A,B,V,G,D,E,Zh,Z,I,J,K,L,M,N,O,P,R,S,T,U,F,Kh,C,Ch,Sh,Sch,J,Y,J,E,Yu,Ya".Split(','); 

public static string CyrilicToLatin(string s) 
{ 
    var sb = new StringBuilder((int)(s.Length * 1.5)); 
    foreach (char c in s) 
    { 
    if (c >= '\x430' && c <= '\x44f') sb.Append(CyrilicToLatinL[c - '\x430']); 
    else if (c >= '\x410' && c <= '\x42f') sb.Append(CyrilicToLatinU[c - '\x410']); 
    else if (c == '\x401') sb.Append("Yo"); 
    else if (c == '\x451') sb.Append("yo"); 
    else sb.Append(c); 
    } 
    return sb.ToString(); 
} 
0

Esta es la solución para la transliteración cirílico serbio-latino para la forma como esto: form

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     Dictionary<string, string> slova = new Dictionary<string, string>(); 

     public Form1() 
     { 
      InitializeComponent(); 
      slova.Add("Љ", "Lj"); 
      slova.Add("Њ", "Nj"); 
      slova.Add("Џ", "Dž"); 
      slova.Add("љ", "lj"); 
      slova.Add("њ", "nj"); 
      slova.Add("џ", "dž"); 
      slova.Add("а", "a"); 
      slova.Add("б", "b"); 
      slova.Add("в", "v"); 
      slova.Add("г", "g"); 
      slova.Add("д", "d"); 
      slova.Add("ђ", "đ"); 
      slova.Add("е", "e"); 
      slova.Add("ж", "ž"); 
      slova.Add("з", "z"); 
      slova.Add("и", "i"); 
      slova.Add("ј", "j"); 
      slova.Add("к", "k"); 
      slova.Add("л", "l"); 
      slova.Add("м", "m"); 
      slova.Add("н", "n"); 
      slova.Add("о", "o"); 
      slova.Add("п", "p"); 
      slova.Add("р", "r"); 
      slova.Add("с", "s"); 
      slova.Add("т", "t"); 
      slova.Add("ћ", "ć"); 
      slova.Add("у", "u"); 
      slova.Add("ф", "f"); 
      slova.Add("х", "h"); 
      slova.Add("ц", "c"); 
      slova.Add("ч", "č"); 
      slova.Add("ш", "š"); 
     } 

     // Method for cyrillic to latin 
     private void button1_Click(object sender, EventArgs e) 
     { 
      string source = textBox1.Text; 
      foreach (KeyValuePair<string, string> pair in slova) 
      { 
       source = source.Replace(pair.Key, pair.Value); 
       // For upper case 
       source = source.Replace(pair.Key.ToUpper(), 
             pair.Value.ToUpper());        
      } 
      textBox2.Text = source; 
     } 

     // Method for latin to cyrillic 
     private void button2_Click(object sender, EventArgs e) 
     { 
      string source = textBox2.Text; 
      foreach (KeyValuePair<string, string> pair in slova) 
      { 
       source = source.Replace(pair.Value, pair.Key); 
       // For upper case 
       source = source.Replace(pair.Value.ToUpper(), 
             pair.Key.ToUpper()); 
      } 
      textBox1.Text = source; 
     } 
    } 
} 
+0

Si "lj", "nj" y "dž" no están en el comienzo del diccionario, se traduciría como "лј", "нј" y "дж" en lugar de "љ", "њ" y "џ ". Además, inmóvil debería tener mayúsculas "Љ", "Њ" y "Џ", porque sin eso, se traduciría como "LJ", "NJ" y "DŽ", en lugar de "Lj", "Nj" y "Dž". Se pueden hacer otros caracteres en mayúsculas con el método ToUpper(). –

Cuestiones relacionadas