【发布时间】:2013-05-29 12:01:02
【问题描述】:
我正在提取韩国游戏(Ragnarok Online)的数据来为其建立数据库。多年来,我在 c# 中将字符串从 ISO-8859-1 编码转换为 EUC-KR 编码没有任何问题。
我用来转换字符串的函数是这个。
return Encoding.GetEncoding("EUC-KR").GetString(Encoding.GetEncoding("ISO-8859-1").GetBytes(text);
例子
º»Ç︧ -> 본헬름
现在我遇到一些字符不能正确转换,我不知道为什么。
ansi 字符串转换为
Œc¾ç²á -> Oc양꿍
我认为这是错误的。我在 notepad++ 中对编码进行了一些测试,如果我将字符串转换为韩语(Windows-949 而不是 EUC-KR),它会显示正确的。
똠양꿍
但在 C# 中,如果我使用 Codepage 949,它仍然会转换为错误的。 .net 框架中不知道代码页“Windows-949”。
什么是正确的编码或源字符串是错误的?
非常感谢。
/edit:问题已解决。 似乎 ISO-8859-1 和 EUC-KR 是错误的。如果我从 1252 -> 949 转换就可以了。
【问题讨论】:
-
对我来说真正的问题是:你从哪里得到
text?对于编码场景,我希望输入为byte[]。如果您以某种方式解析了text,而不是正确的编码,那么您很可能在它接近此代码之前很久就已经破坏了该值。 -
从文本文件中读取文本。看起来 ISO-8859-1 确实不是它的正确编码。使用源代码页 1252 和目标代码页 949 可以正常工作。但奇怪的是第一次遇到这样的问题。
-
但是...您为什么还要尝试 ISO-8859-1 / 1252 / 949?您似乎知道正确的编码 - 它是 51949 aka EUC-KR。您应该使用该编码读取文本文件。
-
嗯,有些来自文本文件,有些来自 lua 脚本,我无法控制在 nLua 中传递的编码。取决于 Ragnarok Online 的版本。
-
像这样在编码之间改组不是解决此问题的方法 - 您有无声的数据丢失/损坏的风险。目前尚不清楚 lua 在这里扮演什么角色,但同样:对文本文件的所有文件访问必须使用正确的编码。否则输出未定义。它不是“大部分正确的”——它是未定义。您不能以错误的编码进行解码,然后再进行修复:最初的“解码”步骤可能(并且将会)简单地破坏文本。