You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:15:41