我的目标是将 .NET 字符串 (Unicode) 转换为 Windows-1252,并在必要时将原始 UTF-8 字符串存储在 Base64 实体中。
例如,转换为 1252 的字符串“DJ Doena”仍然是“DJ Doena”。
但是,如果您将树(木)的日语汉字转换为 1251,您最终会得到一个问号。
这些是我的测试字符串:
String doena = "DJ Doena";
String umlaut = "äöüßéèâ";
String allIn = "< ä ß á â & 木 >";
这就是我首先转换字符串的方式:
using (MemoryStream ms = new MemoryStream())
{
using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
{
sw.Write(decoded);
sw.Flush();
ms.Seek(0, SeekOrigin.Begin);
using (StreamReader sr = new StreamReader(ms, Encoding.GetEncoding(1252)))
{
encoded = sr.ReadToEnd();
}
}
}
问题是,虽然调试字符串比较声称两者确实是相同的,所以一个简单的==
or.Equals()
是不够的。
这就是我尝试找出是否需要 base64 并生成它的方法:
private static String GetBase64Alternate(String utf8Text, String windows1252Text)
{
Byte[] utf8Bytes;
Byte[] windows1252Bytes;
String base64;
utf8Bytes = Encoding.UTF8.GetBytes(utf8Text);
windows1252Bytes = Encoding.GetEncoding(1252).GetBytes(windows1252Text);
base64 = null;
if (utf8Bytes.Length != windows1252Bytes.Length)
{
base64 = Convert.ToBase64String(utf8Bytes);
}
else
{
for(Int32 i = 0; i < utf8Bytes.Length; i++)
{
if(utf8Bytes[i] != windows1252Bytes[i])
{
base64 = Convert.ToBase64String(utf8Bytes);
break;
}
}
}
return (base64);
}
第一个字符串doena
完全相同,不会产生 base64 结果
Console.WriteLine(String.Format("{0} / {1}", windows1252Text, base64Text));
结果是
DJ Doena /
但是第二个字符串umlauts
在 UTF-8 中的字节数已经是 1252 中的两倍,因此即使看起来没有必要,它也会生成一个 Base64 字符串:
äöüßéèâ / w6TDtsO8w5/DqcOow6I=
第三个做了它应该做的事情(不再是“木”而是一个“?”,因此需要base64):
< ä ß á â & ? > / PCDDpCDDnyDDoSDDoiAmIOacqCA+
有什么线索可以增强我的 Base64 吸气剂 a) 性能 b) 以获得更好的结果吗?
先感谢您。:-)