Angular与C#间Base64编解码特殊字符问题求助
解决Angular与C#间Base64编码解码乱码问题
问题原因
window.btoa API仅支持ASCII字符集,对于非ASCII字符(比如示例中的é),它会按**ISO-8859-1(Latin1)**编码为单字节(é对应0xE9),但C#端用UTF8.GetString解码时,0xE9不是有效的UTF-8编码(UTF-8中é需要两个字节0xC3 0xA9),因此出现乱码。
解决方案
方案一:修改Angular端编码逻辑(推荐)
将字符串先转为UTF-8字节序列,再进行Base64编码,确保两端编码规则一致:
// 自定义UTF-8转Base64函数 function utf8ToBase64(str: string): string { const encoder = new TextEncoder(); const utf8Bytes = encoder.encode(str); const binaryStr = String.fromCharCode(...utf8Bytes); return window.btoa(binaryStr); } // 使用示例 let encodedText = utf8ToBase64("demoé"); // 编码结果为 ZGVtb+Oq=
方案二:修改C#端解码逻辑(兼容旧编码)
如果无法改动前端代码,C#端可改用ISO-8859-1编码解码:
string encodedText = "ZGVtb+k="; byte[] data = Convert.FromBase64String(encodedText); // 使用ISO-8859-1编码解码 string decodedString = Encoding.GetEncoding("ISO-8859-1").GetString(data); // 正确得到 demoé
验证说明
- 方案一编码后的Base64字符串
ZGVtb+Oq=,在C#用UTF8.GetString解码可直接得到正确结果demoé。 - 方案二无需修改前端代码,直接适配旧编码逻辑即可解决乱码问题。
内容的提问来源于stack exchange,提问作者chaitanya reddy
相关产品推荐
相关产品推荐

