Функции lastIndexOf(val) и indexOf() не находят русских символов в подстроке.

krepton85
Offline
Зарегистрирован: 02.02.2016

Почему функции lastIndexOf(val) и indexOf() не находят русских символов в подстроке? И где исправить это в Arduino IDE ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Находят, просто Вы не то ищете.

krepton85
Offline
Зарегистрирован: 02.02.2016

Не находят, у меня версия ide 1.6.8 нужно находить подстроки где содержаться однавременно и английские и русские символы (но походу это не важно, должно и те и др. одновременно находить). 

Например читаю содержимое внешней EEPROM в буфер String. А в буфере ищу этими функциями что нужно, например:

if(buf_i2c_EEPROM.indexOf("XEROX2", 2) != -1){
//здесь действие если найдено с этим все отлично

}

а если например в буфере нужно найти ЁПXEROX с помощью команды:

if(buf_i2c_EEPROM.lastIndexOf("ЁПXEROX") != -1){
 //действие не выполняется 
}

Разумеется в буфере String buf_i2c_EEPROM имеется нужная информация.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

krepton85 пишет:

Разумеется в буфере String buf_i2c_EEPROM имеется нужная информация.

Что заставляет Вас так думать? Я вот, уверен, что это не так.

Вы можете легко проверить: достаточно напечатать содержимое переменной buf_i2c_EEPROM посимвольно в виде чисел (кодов), и также посимвольно в виде чисел (кодов символов) напечатать константу "ЁПXEROX", и убедиться. что русские буквы в Вашей EEPROM и в Вашей константе записаны в разных кодировках.

Сделайте это и убедитесь сами.

krepton85
Offline
Зарегистрирован: 02.02.2016

А я понял, вы предлогаете напичатать в serial не по таблице ASCII а в битовом виде. Ок сейчас попробую. Действительно интересно. ;) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Зачем в битовом? Побайтно. Каждый байт, как число. И убедитесь, что кодировки разные.

krepton85
Offline
Зарегистрирован: 02.02.2016

В общем получил следующее строка "ЁПXEROX" в виде char моссива по битово выглядит так:

D0  81  D0  9F  58  45  52

А из String буфера тажа самая строка по битово выглядит так (точно так же как она записанна в EEPROM)

A8  CF  58  45  52  4F  58

Действительно кодировки разные используют char моссив и объект класса String. Вот только странно почему функции 

lastIndexOf() 

нужно указывать char моссив, а не подстроку объекта класса String.

Видимо нужно мне использовать другую функцию которая сравнивает 2 строки объекта класса.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, нет, Вам надо разобраться с кодировками. Чтобы кодировка в IDE (в константе, набранной руками) совпадала с кодировкой, которую Вы пишете в eeprom (не знаю, откуда Вы её берёте).

krepton85
Offline
Зарегистрирован: 02.02.2016

ЕвгенийП пишет:

 (не знаю, откуда Вы её берёте).

К сожелению в EEPROM я минять данные не могу это противоречет моему проекту. Я делаю чип-рессеттер (авто-программатор) для чипов (на базе 24сXX) лазерных картрыджей Ricoh и очень древних моделей Xerox & Samsung.

В общем задача этого прибора автоматически определять модель МФУ/принтера по идентификатору модели (содержится в первых 16 битах 24сXX). А затем на основе полученных данных прошивать нужную прошивку (дамп слитый с обсолютно нового чипа картрыджа). Все дампы слепленны в один и хроняться в SPI Flash.

Сам проект не новый, просто решил его перенести на Ардуино да и добавить новых моделей. Но не нравится мне этот ресеттер (просто попросили на соответствующем форуме) я собрал уже себе др. по круче, полноценный автономный программатор PortableProg - аналог PonyProg. Вот он мой PortableProg https://youtu.be/lUPYzY64ktQ вот эта тема мне нравится. А с этим авто-прогом сплоошная возня. :) 

Здесь обсуждение PortableProg: http://www.testcopy.ru/forum/viewtopic.php?f=22&t=10649&sid=5aa4ae466f84a7392a7e42c2701a3508&start=100

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

krepton85, перечитайте внимательно сообщение №7. Похоже, Вы его просто не поняли.

Если все равно не поняли, рискну чуть подправить пост Евгения согласно опубликованной после его сообщения информации:

"Да, нет, Вам надо разобраться с кодировками. Чтобы кодировка в IDE (в константе, набранной руками) совпадала с кодировкой, которая используется в eeprom (не знаю, откуда Вы её берёте).

krepton85
Offline
Зарегистрирован: 02.02.2016

Да я понял, что это можно изменять с обеих старон, либо в EEPROM либо в самой команде buf_i2c_EEPROM.lastIndexOf("здесь")