我正在使用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";
在所有情况下,它都表示所有字符串都相同。
答案 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());
希望得到这个帮助。