C# 将字符串转换为韩语编码

C# 将字符串转换为韩语编码,c#,encoding,C#,Encoding,我正在提取一款韩国游戏Ragnarok的在线数据,为它建立一个数据库。多年来,我一直在用c将字符串从ISO-8859-1编码转换为EUC-KR编码 我用来转换字符串的函数是这样的 return Encoding.GetEncoding("EUC-KR").GetString(Encoding.GetEncoding("ISO-8859-1").GetBytes(text); 范例 º»Ç︧ -> 본헬름 现在我遇到一些字符转换不正确,我不知道为什么 ansi字符串将转换为 Œc¾ç

我正在提取一款韩国游戏Ragnarok的在线数据,为它建立一个数据库。多年来,我一直在用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语言中,如果我使用代码页949,它仍然会转换成错误的代码页。 Windows-949的代码页在.net framework中未知

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

多谢各位

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

上的德语维基页面比较EUC-KR和949,并说明

这是一个非常简单的例子 Bereich von 0x41-0x7A befinden

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

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


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

感谢您添加了对问题答案的编辑。我有一个旧数据库中的数据,该数据库中的数据以韩语编码存储,但显示不正确

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

我的代码上下文来自.NET forms 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();
    }






}

对我来说,真正的问题是:你是从哪里收到短信的?对于编码方案,我希望输入为byte[]。如果您解析的文本不是正确的编码方式,则很可能您早在值接近此代码之前就已经损坏了该值。文本是从文本文件读取的。看起来ISO-8859-1并不是它的正确编码。对于源代码页1252和目标代码页949,它可以正常工作。但奇怪的是,这是我第一次遇到这样的问题。但是。。。你为什么还要尝试ISO-8859-1/1252/949?您似乎知道正确的编码-它是51949又名EUC-KR。您应该使用该编码读取文本文件。有些来自文本文件,有些来自lua脚本,我无法控制nLua中传递的编码。取决于Ragnarok Online的版本。在这样的编码之间进行混洗不是解决此问题的方法-您可能会面临无声数据丢失/损坏的风险。现在还不清楚lua在这里扮演什么角色,但再一次:对文本文件的所有文件访问都必须使用正确的编码。否则,不定义输出。这基本上是不对的——它没有定义。你不能用错误的编码进行解码,然后在以后进行修复:最初的解码步骤可能会并且将会破坏文本。