3

我正在提取韩国游戏(Ragnarok Online)的数据来为其建立数据库。多年来,我将字符串从 ISO-8859-1 编码转换为 c# 中的 EUC-KR 编码没有任何问题。

我用来转换字符串的函数就是这个。

return Encoding.GetEncoding("EUC-KR").GetString(Encoding.GetEncoding("ISO-8859-1").GetBytes(text);

例子

º»Ç︧ -> 본헬름

现在我遇到一些字符转换不正确,我不知道为什么。

ansi 字符串转换为

Œc¾ç²á -> Oc양꿍

我认为这是错误的。我在记事本++中进行了一些编码测试,如果我将字符串转换为韩语(Windows-949而不是EUC-KR),它会显示正确的字符串。

똠양꿍

但是在 C# 中,如果我使用 Codepage 949,它仍然会转换为错误的。.net 框架中不知道代码页“Windows-949”。

什么是正确的编码或者源字符串是错误的?

非常感谢。

/编辑:问题已解决。似乎 ISO-8859-1 和 EUC-KR 是错误的。如果我从 1252 -> 949 转换就可以了。

4

2 回答 2

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






}
于 2013-06-25T08:15:52.287 回答
0

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)情况。

此 MSDN 页面列出了 .Net 支持的代码页 949。

于 2013-05-29T12:18:45.640 回答