Base64编解码结果不一致问题求助
Base64编解码结果不一致的原因及解决办法
问题详情
我有一段Base64字符串:
R1NNQiBBZ2VuY3kgR21iSCAvIFdlYmRlc2lnbiBBZ2VudHVyIFVsbSAvIE9ubGluZXNob3AgQWdlbnR1ciAvIEFwcCBBZ2VudHVyIFVsbSwgR2VybWFueS==
用在线解码器解码后得到文本:
GSMB Agency GmbH / Webdesign Agentur Ulm / Onlineshop Agentur / App Agentur Ulm, Germany
但把这段解码后的文本重新转成Base64时,结果变成了:
R1NNQiBBZ2VuY3kgR21iSCAvIFdlYmRlc2lnbiBBZ2VudHVyIFVsbSAvIE9ubGluZXNob3AgQWdlbnR1ciAvIEFwcCBBZ2VudHVyIFVsbSwgR2VybWFueQ==
我的C#解码代码:
string basestring = "R1NNQiBBZ2VuY3kgR21iSCAvIFdlYmRlc2lnbiBBZ2VudHVyIFVsbSAvIE9ubGluZXNob3AgQWdlbnR1ciAvIEFwcCBBZ2VudHVyIFVsbSwgR2VybWFueS=="; string output = Encoding.UTF8.GetString(Convert.FromBase64String(basestring)); return output;
编码代码:
string basestring = "GSMB Agency GmbH / Webdesign Agentur Ulm / Onlineshop Agentur / App Agentur Ulm, Germany"; string output = Convert.ToBase64String(Encoding.UTF8.GetBytes(basestring)); return output;
原因排查
问题出在GmbH里的ß字符上——原始Base64解码出来的ß和你手动复制的ß,编码字节完全不同:
- 原始解码得到的是单字节的UTF-8字符(0xDF),这是传统德语里的小写
ß; - 你从在线工具复制的文本中,这个字符被自动转换成了双字节的Unicode大写连字
ẞ(U+1E9E,UTF-8编码为0xE1 0xBA 0x9E)。
这两个字符肉眼几乎无法区分,但字节数差异直接导致Base64编码结果不同,原始Base64末尾的S==和重新编码后的Q==,就是这两个字符的编码差异造成的。
验证方式
你可以在C#里打印解码后文本的字节数组,确认ß的编码:
byte[] decodedBytes = Convert.FromBase64String(basestring); foreach (byte b in decodedBytes) { Console.WriteLine(b.ToString("X2")); }
找到GmbH对应位置的字节,会看到是DF;而复制在线工具输出的文本转成字节,对应位置会是E1 BA 9E。
解决办法
不要手动复制在线工具的解码结果来重新编码,直接用C#解码得到的字符串作为输入:
// 先完成解码 string decodedText = Encoding.UTF8.GetString(Convert.FromBase64String("R1NNQiBBZ2VuY3kgR21iSCAvIFdlYmRlc2lnbiBBZ2VudHVyIFVsbSAvIE9ubGluZXNob3AgQWdlbnR1ciAvIEFwcCBBZ2VudHVyIFVsbSwgR2VybWFueS==")); // 用解码后的字符串直接重新编码 string reEncodedBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(decodedText)); // 此时reEncodedBase64会和原始Base64完全一致
内容的提问来源于stack exchange,提问作者Tomas Dovidavičius
相关产品推荐
相关产品推荐

