C#字符串不支持西里尔字符

时间:2015-01-12 22:34:16

标签: c# encoding utf-8 unity3d mono

我正在使用C#编码驱动坚果,试图将字符串中的西里尔字符存储起来,到目前为止我还没有找到解决方案。

例如,如果我执行以下代码:

string test = "АЗУОЫЯЕЁЮИ";

测试变量将为每个字符包含两个问号,而不是字符本身。

似乎它使用ASCII进行编码,但我认为在C#默认情况下所有字符串都是UTF8,但是如果它使用的是ASCII而我没有找到改变它的方法,所以我不知道该怎么做做。

我正在使用在OSX Yosemite下的Unity游戏引擎中的捆绑包中的Mono Develop。我把这些文件保存为UTF8,我用iconv对它进行了双重检查,以防万一Mono Develop做得不对。毫无疑问,它们是UTF8。

我已经看过关于编码的C#文档,但我担心我不太了解它,因为我找不到任何可以帮助我解决这个问题的东西。

编辑:我正在添加此代码,因为它表明问题不仅仅是您所看到的问题,而是内部编码本身的问题。 (顺便说一句,“А”字符不是ASCII“A”而是俄语西里尔语“А”):

            // Debug code
            string one = "А";
            string two = "А";
            string three = "З";         
            string logMessageOne = (one == two) ? "One is equal to Two" : "One is different than Two";
            string logMessageTwo = (one == three) ? "One is equal to Three" : "One is different than Three";
            string logMessageThree = (one.CompareTo (three) == 0) ? "One is equal to Three" : "One is different than Three";

在所有情况下,它都表示所有字符串都相同。

3 个答案:

答案 0 :(得分:2)

每个带有Unicode字符的文件都需要编码为utf8,并且bom可以统一使用。默认情况下,monodevelop不会这样做(普通的utf8),至少在osx上是这样。

在Windows上,使用notepad ++或类似文件编辑此文件,并使用bom将编码更改为utf8。如果您使用的是osx,我可以为您发送一个工具。

如果添加bom,它通常会停留在那里,无需每次保存都重复此操作。

答案 1 :(得分:1)

好的,我终于找到了问题并解决了问题。这显然是Unity编辑器中的另一个错误:它不仅需要UTF-8文件,而且它们必须有BOM,尽管根据UTF-8规范这些字节是可选的。更糟糕的是,使用相同的Unity游戏引擎分发的Mono Develop环境不会将UTF-8与BOM一起保存,因此我最终手动添加它只是为了尝试并且有效。

OSX命令行中只需三步:

cp KeyboardRussian.cs aux
echo -ne '\xEF\xBB\xBF' > KeyboardRussian.cs
cat aux >> KeyboardRussian.cs

它就像魅力一样。

为了信誉,ChanibaL在他的回答中提到了BOM,尽管我没有注意到它。

无论如何使用此解决方案,您在OSX中不需要任何其他工具,而对于Windows,您可能只需要进行微小的更改:

copy KeyboardRussian.cs aux
echo -ne '\xEF\xBB\xBF' > KeyboardRussian.cs
type aux >> KeyboardRussian.cs

请注意,我还没有在Windows中对其进行测试,尽管它应该有效。

答案 2 :(得分:0)

也许你可以使用字典,然后比较字符串:

        var map = new Dictionary<char, string>
            {
                {'а', "a"},
                {'б', "b"},
                {'в', "v"},
                {'г', "g"},
                {'д', "d"},
                {'е', "e"},
                {'ё', "yo"},
                {'ж', "zh"},
                {'з', "z"},
                {'и', "i"},
                {'й', "j"},
                {'к', "k"},
                {'л', "l"},
                {'м', "m"},
                {'н', "n"},
                {'о', "o"},
                {'п', "p"},
                {'р', "r"},
                {'с', "s"},
                {'т', "t"},
                {'у', "u"},
                {'ф', "f"},
                {'х', "h"},
                {'ц', "c"},
                {'ч', "ch"},
                {'ш', "sh"},
                {'щ', "sch"},
                {'ъ', "j"},
                {'ы', "i"},
                {'ь', "j"},
                {'э', "e"},
                {'ю', "yu"},
                {'я', "ya"},
                {'А', "A"},
                {'Б', "B"},
                {'В', "V"},
                {'Г', "G"},
                {'Д', "D"},
                {'Е', "E"},
                {'Ё', "Yo"},
                {'Ж', "Zh"},
                {'З', "Z"},
                {'И', "I"},
                {'Й', "J"},
                {'К', "K"},
                {'Л', "L"},
                {'М', "M"},
                {'Н', "N"},
                {'О', "O"},
                {'П', "P"},
                {'Р', "R"},
                {'С', "S"},
                {'Т', "T"},
                {'У', "U"},
                {'Ф', "F"},
                {'Х', "H"},
                {'Ц', "C"},
                {'Ч', "Ch"},
                {'Ш', "Sh"},
                {'Щ', "Sch"},
                {'Ъ', "J"},
                {'Ы', "I"},
                {'Ь', "J"},
                {'Э', "E"},
                {'Ю', "Yu"},
                {'Я', "Ya"}
            };
        var LatinText = string.Concat("АЗУОЫЯЕЁЮИ".Select(c => map[c]));
        Console.WriteLine(LatinText.ToString());

希望得到这个帮助。