Две струны выглядят одинаково, они одного размера.
Хотя WiFI.SSID()
возвращает объект String, он не обязательно должен быть в кодировке ASCII. Кодировка строки зависит от настройки локали маршрутизатора, и причина, по которой она выглядит так же, заключается в том, что Serial.print()
преобразует ее в ASCII. Это может быть доказано в следующем эскизе с использованием как Serial.print()
, так и Serial.printf()
в ESP32, который показывает, что фактически получено (Serial.printf()
, однако, не поддерживает форматирование Unicode в реализации ESP32, поэтому будет производить некоторые символы мусора).
int n = WiFi.scanNetworks();
for (int i=0; i<n; i++) {
// Serial.print() will cast the WiFi.SSID() to ASCII
Serial.print(WiFi.SSID(i));
// this shown what WiFi.SSID() truly return
Serial.printf(" --- %s\n", WiFi.SSID(i));
}
Результат будет показан на этом рисунке. Как вы можете видеть, некоторые SSID дают правильные результаты, но некоторые отображаются как мусор.
![enter image description here](https://i.stack.imgur.com/M0TJw.png)
Таким образом, оператор сравнения строк выполняет свою работу правильно при сравнении WiFi.SSID(i) == SSID
и результат действительно не обязательно должен быть одинаковым для некоторого SSID, даже если он "выглядит" одинаково для человека.
Итак, как решить эту проблему? Если вы хотите рассматривать их «как одно и то же», по иронии судьбы, преобразование объекта String в массив символов с помощью .c_str()
действительно выполняет свою работу, поскольку оно преобразует каждый символ в ASCII. Думаю, вы просто неправильно использовали сравнение массивов символов strcmp () .
if(strcmp(WiFi.SSID(i).c_str(), SSID.c_str()) == 0) {
// match
}
else {
// not match
}
Если вы говорите, что это сравнение c .str () возвращает -244, затем отредактируйте свой вопрос и сделайте Serial.printf()
на обоих String или лучше на l oop через символ String по уставу и распечатайте HEX-код, чтобы увидеть, что происходит.