如何正确编解码含NBSP等特殊字符的字符串及优化负载大小?
解决方案
一、修复服务端解码逻辑
你当前的服务端仅完成了Base64解码,得到的是encodeURIComponent处理后的URI编码字符串,必须补充URL解码步骤才能还原NBSP等特殊字符。
修改后的C#代码:
using System; using System.Text; using System.Net; public string DecodeOriginalString(string value) { // 第一步:Base64解码 var base64DecodedBytes = Convert.FromBase64String(value); // 第二步:将字节转成URI编码格式的字符串 var uriEncodedStr = Encoding.UTF8.GetString(base64DecodedBytes); // 第三步:URL解码还原原始字符(包括NBSP) return WebUtility.UrlDecode(uriEncodedStr); }
执行后,SELECT%C2%A0a%C2%A0FROM%C2%A0b会被正确解码为带NBSP的原始字符串。
二、更高效的负载压缩方案(低优先级)
原客户端流程encodeURIComponent → btoa会额外增加字符长度(比如NBSP被转成%C2%A0再Base64),可以直接对字符串的UTF-8字节做Base64编码,跳过URI编码步骤——Base64本身就能安全传输所有字节,不会触发Cloudflare等过滤器拦截,同时压缩效果更好。
客户端修改代码:
// 将字符串转为UTF-8字节数组 const encoder = new TextEncoder(); const utf8Bytes = encoder.encode("SELECT\xa0a\xa0FROM\xa0b"); // \xa0代表NBSP // 将字节数组转为Base64字符串 const encoded = btoa(String.fromCharCode(...utf8Bytes));
对应服务端简化代码:
public string DecodeOptimizedString(string value) { var base64DecodedBytes = Convert.FromBase64String(value); // 直接将Base64解码后的字节转成UTF-8字符串,无需URL解码 return Encoding.UTF8.GetString(base64DecodedBytes); }
这种方式能有效减小负载大小,同时完全保留原始字符串的结构与特殊字符。
内容的提问来源于stack exchange,提问作者Shahar Shokrani
相关产品推荐
相关产品推荐

