Arduino C++处理Web表单字符串:二次编码特殊字符还原方法
Arduino中解决URL二次编码还原问题
你遇到的是URL二次编码问题:原始参数里的特殊字符先被编码一次(比如%→%25、\→%5C),传输过程中又被编码了一次,导致最终接收的是二次编码后的字符串。要还原只需执行一次URL解码即可。
方案1:利用ESP8266/ESP32自带的解码函数
如果你用的是ESP系列开发板,网络库已经内置了urlDecode函数,直接调用即可:
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> // ESP32对应#include <WebServer.h> ESP8266WebServer server(80); // ESP32对应WebServer server(80); void handleCommand() { // 获取二次编码后的value参数 String encodedValue = server.arg("value"); // 执行一次解码,还原到原始编码状态 String restoredValue = urlDecode(encodedValue); Serial.print("还原后的value:"); Serial.println(restoredValue); // 输出 N%6eE8qiCZ\r server.send(200, "text/plain", "处理完成"); } void setup() { Serial.begin(115200); // 此处添加WiFi连接代码 server.on("/api/command", handleCommand); server.begin(); } void loop() { server.handleClient(); }
方案2:自行实现URL解码函数(通用所有Arduino板)
如果你的开发板没有自带解码函数,自己写一个轻量版的URL解码逻辑即可:
// 自定义URL解码函数 String urlDecode(String input) { String decoded = ""; char hexBuf[] = "0x00"; for (int i = 0; i < input.length(); i++) { if (input[i] == '%') { // 提取%后的两位十六进制字符 if (i + 2 < input.length()) { hexBuf[2] = input[i+1]; hexBuf[3] = input[i+2]; // 转成对应ASCII字符 decoded += (char)strtol(hexBuf, NULL, 16); i += 2; // 跳过已处理的两位 continue; } } else if (input[i] == '+') { decoded += ' '; // URL编码中+代表空格 } else { decoded += input[i]; } } return decoded; } // 使用示例 void setup() { Serial.begin(115200); String receivedValue = "N%256eE8qiCZ%5Cr"; String restoredValue = urlDecode(receivedValue); Serial.print("还原后的值:"); Serial.println(restoredValue); // 输出 N%6eE8qiCZ\r } void loop() {}
注意事项
- 上述解码仅执行一次,刚好匹配你遇到的二次编码场景;如果存在多次编码情况,可以循环解码直到字符串中不再包含
%25。 - 原始参数中的
\r被编码为%5Cr,解码后会准确还原为\r字符。
内容的提问来源于stack exchange,提问作者Eki
相关产品推荐
相关产品推荐

