我们在下面的编码方法接受来自遗留系统文件的输入字符串(以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);
}