【发布时间】:2014-02-11 17:48:18
【问题描述】:
字节数组 b64 有时是 UTF-8,有时是 UTF-16。我一直在网上读到 C# 字符串总是 UTF-16,但我这里不是这种情况。为什么会发生这种情况,我该如何解决?我有一个将base64字符串转换为普通字符串的简单方法:
public static string FromBase64(this string input)
{
String corrected = new string(input.ToCharArray());
byte[] b64 = Convert.FromBase64String(corrected);
if (b64[1] == 0)
{
return System.Text.Encoding.Unicode.GetString(b64);
}
else
{
return System.Text.Encoding.UTF8.GetString(b64);
}
}
我的 base 64 编码器也发生了同样的事情:
public static string ToBase64(this string input)
{
String b64 = Convert.ToBase64String(input.GetBytes());
return b64;
}
public static byte[] GetBytes(this string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
示例: 在我的电脑上,“cABhAHMAcwB3AG8AcgBkADEA”解码为:
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
但在我同事的电脑上却是:
'p','a','s','s','w','o','r','d','1'
编辑:
我知道我创建的字符串来自一个文本框,并且我保存它的文件总是 UTF-8,所以一切都指向导致我的编码切换的 Convert 方法。
更新:
在进一步挖掘之后,我的同事似乎在他的代码版本中注释了一个非常重要的行,该行将从文件读取的值保存到哈希表中。我使用的默认值是 UTF-8 base64 值,所以我将把默认值更正为 utf-16 值,然后我可以清理删除任何 UTF8 引用的代码。
另外,我一直在天真地使用从网站检索到的 UTF-8 base64 编码,没有意识到自己在做什么。有趣的是,如果我的同事没有评论保存文件中的值的行,我永远不会发现这个事实。
代码的最终版本:
public static string FromBase64(this string input)
{
byte[] b64 = Convert.FromBase64String(input);
return System.Text.Encoding.Unicode.GetString(b64);
}
public static string ToBase64(this string input)
{
String b64 = Convert.ToBase64String(input.GetBytes());
return b64;
}
public static byte[] GetBytes(this string str)
{
return System.Text.Encoding.Unicode.GetBytes(str);
}
【问题讨论】:
-
String corrected = new string(input.ToCharArray());应该做什么?这没有任何意义。 -
这是为了让输出播放得很好。我以为它对输出没有影响,但没有,我只是在发布问题之前没有删除它。
标签: c# unicode encoding utf-8 base64