Две струны выглядят одинаково, они одного размера.
Хотя 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 дают правильные результаты, но некоторые отображаются как мусор.
Таким образом, оператор сравнения строк выполняет свою работу правильно при сравнении 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-код, чтобы увидеть, что происходит.