如何在C#中将 Cyrillic 字符串转换为英文

7

在C#中,是否有可能将西里尔字母的字符串转换为英文(拉丁文)? 例如,我需要将“Петролеум”转换为“Petroleum”。 另外,我忘了提到一点,如果我有一个西里尔字母的字符串,它需要保持原样,那么我能否进行检查?


2
嘿,我刚发现了一些可能对你也很重要的事情。如果你正在转写官方文本(如广告客户的地址或其他内容),你需要检查是否有包含转写表的特殊法律。例如,保加利亚就有这样的法律,任何误用都可能导致法律问题。除了表格外,还可能描述了规则的例外情况,你也需要遵循。例如,“България”是“Bulgaria”,而不是“Balgariya”。 - vlood
10个回答

9

我不熟悉西里尔字母,但如果你只需要将西里尔字母与拉丁字母进行一对一的映射,你可以使用字符对字典,并逐个映射每个字符:

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

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

我本来想避免这种情况的,但还是谢谢 :) 我在想是否有一些更简洁的 .Net 或 C# 的方法。 - Pece
@Pece:我不知道有没有内置的方法可以做到这一点... 顺便说一句,如果性能是一个问题,使用char[]或StringBuilder而不是LINQ。 - dtb
5
不是一对一的映射关系。有些西里尔字符需要多个拉丁字符来表示。 - PauliL
这是我迄今为止找到的最长但最简单的解决方案,所以谢谢 :) - Pece

4

这种方法非常快:

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

3
您可以使用 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;
        }
    }
}

如果你需要将西里尔字母转换成拉丁字母:

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

将拉丁字母转换成西里尔字母

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

如果输入中还包含一些拉丁字符怎么办?例如我有一个类似于“унесите град (城市)”的输入,它被转换成了“unesite grad (situ)”。其中"SITU"部分是错误的...或者当我有一些公司名称像“AUIМРЕХ”时,它被转换成了“AUIMREH”,如何处理这些情况? - sosNiLa

3
当然,您可以将字母映射到拉丁转录中,但在大多数情况下,您无法得到英语单词。例如,Российская Федерация的转录为Rossiyskaya Federatsiya。wikipedia提供了映射的概述。您可能正在寻找翻译服务,Google可能会提供API。

3
如果您使用的是Windows 7,您可以利用新的ELS(扩展语言服务)API来提供转写功能。 请查看Windows 7 API Code Pack——它是在Windows 7上许多新API之上的托管包装器集合(例如新的任务栏)。在示例文件夹中查找Transliterator示例,您会发现它正是您所寻找的内容。

2

0
使用一个包含俄语和英语单词的字典作为查找表。虽然构建它需要大量的打字工作,但这是一种完美可靠的方法。

3
不一定。如果谷歌无法提供一个万无一失的词典,他也不能做到。 - Femaref

0

你为什么想要这样做?一对一地改变字符通常甚至不能产生合理的音译,更不用说翻译了。你可能会发现this帖子很有趣。


0

您正在寻找一种将用西里尔字母书写的俄语单词(在某些编码中,例如甚至是拉丁编码,因为ISO 8859-5也称为Latin-5适用于西里尔字母)转换为拉丁字母(带有重音符号)的方法吗?

我不知道.NET是否有一些转换工具,但我敢说它(像许多其他好的框架一样)没有。这个维基百科链接可能会给您一些实现转换的想法,但这不是唯一的方法,请记住,西里尔字母书写系统不仅仅被俄罗斯人使用,而且您应根据使用该书写系统的语言来应用转换。例如请参阅保加利亚语的相同情况。如果您想自己编写转换器,则此链接(始终来自wp)也可能很有趣。


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

如果字典中的“lj”、“nj”和“dž”不在开头,那么它们将被翻译为“лј”、“нј”和“дж”,而不是“љ”、“њ”和“џ”。此外,字典应该有大写的“Љ”、“Њ”和“Џ”,因为没有这些,它们会被翻译为“LJ”、“NJ”和“DŽ”,而不是“Lj”、“Nj”和“Dž”。其他大写字符可以使用ToUpper()方法完成。 - Bojan Jovanovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接