【问题标题】:Converting string to korean encoding将字符串转换为韩文编码
【发布时间】: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 在这里扮演什么角色,但同样:对文本文件的所有文件访问必须使用正确的编码。否则输出未定义。它不是“大部分正确的”——它是未定义。您不能以错误的编码进行解码,然后再进行修复:最初的“解码”步骤可能(并且将会)简单地破坏文本。

标签: c# encoding


【解决方案1】:

感谢您添加带有问题答案的编辑。我有来自旧数据库的数据,其中数据以无法正确显示的韩语编码存储。

在使用代码将数据转换为不同编码数小时后,我遇到了您的问题。我进行了代码页 1252 到代码页 949 的转换,然后我开始从数据库条目中获取有效的韩语单词。

我的代码上下文来自一个 .NET 表单 Web 应用程序,我在下面包含了 Page_load 函数,以提供有关如何从一种编码转换为另一种编码的示例代码:

protected void Page_Load(object sender, EventArgs e)
{

    string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["DictionaryConnection"].ToString();
    using (SqlConnection conn = new SqlConnection(strConn))
    {
        conn.Open();

        string strSQL = "Select top(100) * from Parts";


        SqlCommand command = new SqlCommand(strSQL, conn);

        SqlDataReader sdr = command.ExecuteReader();

        DataTable dt = new DataTable();

        dt.Load(sdr);


        sdr.Close();


        StringBuilder sbOut = new StringBuilder();


        sbOut.Append("<table border=\"1\">");
        sbOut.Append("<tr>");
        foreach (DataColumn dc in dt.Columns)
        {
            sbOut.Append("<th>" + dc.ColumnName + "</th>");

        }

        sbOut.Append("</tr>");

        foreach (DataRow dr in dt.Rows)
        {

        sbOut.Append("<tr>");
        foreach (DataColumn dc in dt.Columns)
        {
            string strOut = "";
            if (dr[dc] != null)
            {
                if (dc.ColumnName=="Part_h")
                {


                    int euckrCodepage = 949;//949;//51949;

                    System.Text.Encoding originalEncoding = System.Text.Encoding.GetEncoding(1252);


                    System.Text.Encoding euckr = System.Text.Encoding.GetEncoding(euckrCodepage);
                    StringBuilder sbEncoding= new StringBuilder();


                    sbEncoding.Append("RAW: " + dr[dc].ToString() + "<br />");


                   byte[] rawbytes= originalEncoding.GetBytes(dr[dc].ToString());


                   string s = euckr.GetString(rawbytes);
                    sbEncoding.Append("STRING AS "+euckr.EncodingName+": " + s + "<br />");


                    strOut = sbEncoding.ToString();
                }
                else
                {
                strOut = dr[dc].ToString();    
                }

            }

            sbOut.Append("<td>" + strOut + "</td>");

        }

            sbOut.Append("</tr>");
        }

        sbOut.Append("</table>");

    conn.Close();
    lblText.Text = sbOut.ToString();
    }






}

【讨论】:

    【解决方案2】:

    Codepage 949 上的德语 wiki 页面比较 EUC-KR 和 949 和状态

    im Gegensatz zu EUC-KR kann sich das nachfolgende Byte jedoch auch im Bereich von 0x41-0x7A befinden

    与 EUC-KR 相比,尾随字节也可以在 0x41 的范围内 到 0x7A

    这适用于“c”(0x63)的情况。

    This MSDN page 列出了 .Net 支持的代码页 949。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多