如何反转此文本编码?

时间:2014-11-18 10:02:45

标签: c# unicode encoding utf-8 vb6

我们在下面的编码方法接受来自遗留系统文件的输入字符串(以VB6字符串的Unicode格式)和编码名称。它应用编码并返回在我们较新的Web应用程序中正确显示的字符串。由于我们的新应用程序具有仍依赖于旧格式的报告后端,因此我需要反转编码以允许新翻译的字符串存储在旧文件中。以下是Encode方法完成的两个转换示例。

Encode("µn¤J¦WºÙ", "BIG5")返回登入名称

Encode("Çàðåãèñòðèðîâàííîå èìÿ", "windows-1251")返回Зарегистрированноеимя

为了扭转这些编码,我一直在尝试基于此处和其他地方发现的问题的各种编码步骤,但迄今为止仅成功产生看似与输入相同的输出,完全由问号组成或由混合物组成ASCII字符和问号与原始输入不同。

编码方法是由一位离职的同事编写的,我必须承认我不完全理解为什么它有编码循环,而我发现的所有其他例子只是从字符串中获取字符,然后是那些使用的字节输入编码,最后使用输出编码从字节中获取字符串。如果我尝试删除编码循环并只执行这三个步骤,则该方法不再返回预期结果。

这是编码方法,我的问题是,如何创建一个相应的Decode方法来反转它的作用?

    private static string Encode(string src, string encoding)
    {
        if (String.IsNullOrWhiteSpace(encoding)) return src;

        Encoding unicode = Encoding.Unicode;
        Encoding sourceEncoding = Encoding.GetEncoding(encoding);

        char[] srcChars = src.ToCharArray();
        byte[] srcBytes = sourceEncoding.GetBytes(srcChars);

        if (srcChars.Length == srcBytes.Length)
        {
            for (int i = 0; i < srcChars.Length; i++)
                if ((int)srcChars[i] < 256)
                    srcBytes[i] = (byte)srcChars[i];
        }
        else
        {
            srcBytes = new byte[srcChars.Length];
            for (int i = 0; i < srcChars.Length; i++)
                srcBytes[i] = (byte)srcChars[i];
        }
        byte[] unicodeBytes = Encoding.Convert(sourceEncoding, unicode, srcBytes);

        return unicode.GetString(unicodeBytes);
    }

0 个答案:

没有答案