Arduino接收HTML数据时非ASCII字符(如@)URL编码还原问题
解决Arduino接收URL编码字符的问题
你遇到的是URL编码问题,%40是@的URL编码形式。下面提供两种可行的解决方法:
方法一:在Arduino中实现URL解码函数(逐字符处理)
直接在接收完字符串后对其进行解码,以下是完整的URL解码函数及整合到你代码中的示例:
String urlDecode(String input) { String decoded = ""; char c; char code0; char code1; for (int i = 0; i < input.length(); i++) { c = input.charAt(i); if (c == '%') { i++; code0 = input.charAt(i); i++; code1 = input.charAt(i); // 将十六进制字符转为十进制 c = (hexToInt(code0) << 4) | hexToInt(code1); } decoded += c; } return decoded; } // 辅助函数:将十六进制字符转为整数 int hexToInt(char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'a' && c <= 'f') return c - 'a' + 10; return 0; } // 你的原有代码整合解码逻辑 String requestBody; while(client.available()){ requestBody += (char)client.read(); } if(requestBody.length()){ String decodedBody = urlDecode(requestBody); Serial.println(decodedBody); // 输出test@essai }
这个函数会逐字符扫描字符串,遇到%时就将后续两个十六进制字符转换为对应的ASCII字符,可解决@及其他URL编码字符的解码问题。
方法二:上游避免URL编码(推荐)
如果可以控制数据发送端(HTML页面),可以从根源上避免编码问题:
- 若用GET请求,修改前端代码,不对发送的内容做URL编码;
- 更推荐改用POST请求,以
application/json或multipart/form-data格式发送数据,这类格式不会对@等特殊字符进行URL编码,Arduino接收后直接就是原始字符串。
内容的提问来源于stack exchange,提问作者user11961902
相关产品推荐
相关产品推荐

