2010-06-20 78 views
7

是否可以將西里爾字符串轉換爲英文(拉丁文)在c#中?例如,我需要將「石油」中的「Петролеум」轉換爲其他類型。 另外我忘了提及,如果我有西里爾字符串它需要保持那樣,所以我可以以某種方式檢查?如何將西里爾字符串轉換爲英文在c#

+2

嘿,剛剛發現的東西,這可能是對你很重要了。如果您正在翻譯正式文本(如廣告客戶的地址或其他內容),則需要檢查是否有包含音譯表的特殊音譯法。例如,保加利亞有這樣的法律,任何濫用都可能導致法律問題。除表格外,可能還會描述該規則的例外情況,您需要遵循。像България是保加利亞,而不是Balgariya。 – vlood 2010-09-14 09:26:06

回答

7

我對西里爾語並不熟悉,但如果它只是西里爾文字符與拉丁字符的一對一映射,您可以使用字符對的字典並分別映射每個字符:

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

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

我試圖避免,但謝謝:) 我想如果有一些更清潔的方式從.NET或C#。 – Pece 2010-06-20 13:47:49

+0

@Pece:我不知道這樣做的內置方法...順便說一句,如果性能是一個問題,請使用char []或StringBuilder而不是LINQ。 – dtb 2010-06-20 13:57:07

+4

這不是ch ch映射。一些西里爾字符需要多個拉丁字符。 – PauliL 2010-06-20 13:58:01

3

你當然可以將這些字母映射到拉丁文轉錄,但在大多數情況下你不會得到英文單詞。例如。 РоссийскаяФедерация轉錄到Rossiyskaya Federatsiya。 wikipedia提供了映射的概述。您可能正在尋找翻譯服務,谷歌可能提供了一個API。

0

使用帶有俄語和英語單詞的字典作爲查找表。打造它會有很多打字,但它充分證明。

+3

不是真的。如果谷歌不能生成一個傻瓜證明字典,他也不能。 – Femaref 2010-06-20 14:32:45

0

你爲什麼要這樣做?一對一改變角色通常甚至不會產生合理的音譯,更不用說翻譯。您可能會發現this帖子是有用的。

0

您正在尋找將cirillic(某些編碼,例如,甚至拉丁編碼,因爲iso 8859-5又名Latin-5用於西里爾文)轉換爲拉丁字母(帶有重音符號)的俄語單詞的方式嗎?

我不知道.NET是否有音譯的內容,但我敢說它(還有很多其他好的框架)沒有。這個wikipedian鏈接可以給你一些想法來實現translitteration,但它不是唯一的方法,並且記住西里爾文寫作系統不被俄語使用,你應用translitteration的方式可能會因使用寫作系統的語言而異。例如。 see the same for bulgarian。如果您想自己編寫translitterator,可能還會有興趣參加5月份的this link(總是來自wp)。

3

如果您使用Windows 7,則可以利用新的ELS(擴展語言服務)API,它爲您提供音譯功能。 查看Windows 7 API Code Pack - 這是一組託管包裝器,位於Windows 7中的許多新API之上(如新的任務欄)。看在了Transliterator例如Samples文件夾,你會發現它是你在尋找什麼:

2

可以使用text.Replace(pair.Key, pair.Value)功能。

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); 
2

這種方法是非常快:

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

這是塞爾維亞西里爾拉丁音譯解決方案的形式是這樣的: 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

如果「lj」,「nj」和「dž」不在字典的開頭,它將被翻譯爲「лј」,「нј」和「дж」而不是「љ」,「њ」和「џ」 」。此外,distionary應該有大寫字母「Љ」,「Њ」和「Џ」,因爲如果沒有它,它將被翻譯爲「LJ」,「NJ」和「DŽ」,而不是「Lj」,「Nj」和「DZ」。其他大寫字符可以用ToUpper()方法完成。 – 2017-02-22 21:30:00

相關問題