Чтение русских символов с SD карты

Тема в разделе "Arduino & Shields", создана пользователем RaZZvedos, 4 окт 2018.

Метки:
  1. RaZZvedos

    RaZZvedos Нуб

    Добрый день.
    Возникла необходимость чтения русских символов из карты памяти в массив.
    Читать нужно строки вида:
    05 Г3
    04 Б2
    03 А4
    06 А1
    11 Б1
    Банальное
    Код (C++):
    symb = txtFiles.read();
    с русскими буквами не работает, на месте буквы ⸮.
    Подскажите пожалуйста, как можно считать русский символ?

    В целом код считывания в массив выглядит так
    Код (C++):
    void readTXT(){
      int x = 0;
      int y = 0;
      char symb;
      sprintf(txtName,"%02d.txt",Selected+1); // формируем имя файла "Selected+1.txt"
      File txtFiles = SD.open(txtName, FILE_READ);          //открываем файл для чтения
      if (txtFiles) {
        while (txtFiles.available()) { //пока есть байт для чтения
          symb = txtFiles.read();
          if(symb == '\t'){              //если считали таб
            txtFiles.seek(txtFiles.position()+5); ///перемещемся на новую строку
            symb = txtFiles.read();
            y++;
            x=0;
          }
          if(!txtFiles.available())break;
          txtNames[x][y] = symb;
          x++;
        }   //while
        txtFiles.close();
      }
      else{                                       //если файл недоступен пишем ошибку
        lcd.clear();
        lcd.setCursor(2, 0);
        lcd.print(L"ОШИБКА ФАЙЛА");
        lcd.setCursor(5, 1);
        lcd.print(Selected+1);
        lcd.print(L".txt");
        return;
      }
    }
     
  2. parovoZZ

    parovoZZ Гуру

    Кодировка? Не, не слышал.
     
  3. parovoZZ

    parovoZZ Гуру

    Я твой кодиоровка буквы алфавит.
     
  4. RaZZvedos

    RaZZvedos Нуб

    Слышал. Как искренний новичок, честно знаю, что есть такое слово.=)
    Сути вопроса это не меняет, и как решить я все равно не понимать.
     
  5. parovoZZ

    parovoZZ Гуру

    Надо чтобы кодировки в файле txt и в абдурино совпадали. Какая кодировка в абдурино сейчас скажут. Я не в курсах.
     
  6. Mitrandir

    Mitrandir Гуру

    Ну смотрите, в той кодировке что на карте букве А соответствует число 201.
    В той кодировке что вы выводите число 201 соответствует нечитаемый символ, а букве А соответствует число 165.
    Вам надо заменить все 201 на 165 и т.д

    Цифры взяты отбалды для примера.
     
  7. parovoZZ

    parovoZZ Гуру

    В блокноте или в хекс редакторе? Ты уточни, а то здесь самое-самое начало))
     
  8. RaZZvedos

    RaZZvedos Нуб

    Допустим. Попробовал через notepad++ сохранять в Windows1251, в UTF8 в UTF8 BOM, UCS2 BE, UCS2 LE. Не помогло. Куда копать дальше?
     
  9. Mitrandir

    Mitrandir Гуру

    а можно спросить, вы их куда выводите? судя по экрана в ЛСД? ЛСД какую кодировку хочет?
     
  10. RaZZvedos

    RaZZvedos Нуб

    Вывожу на LCD Keypad Shield. Напрямую указанные в прошивке фразы выводятся отлично. Но прочитать с sd карты не могу ни в монитор ни на экран.
    IMG_20181004_214802.jpg - это текст из прошивки

    IMG_20181004_215044.jpg - первая строка после семерки текст с sd карты
    Та же строка из монитора выглядит так
    Код (C++):
    ⸮⸮⸮⸮⸮⸮⸮⸮
     
     
    Последнее редактирование: 4 окт 2018
  11. b707

    b707 Гуру

    Автор, у вас проблема не в чтении.
    На карте памяти нет никаких "русских символов", там хранятся байты - и читются они совершенно одинаково, чтобы в них ни лежало - русские буквы. анлийские, китайские...
    Так что не трогайте код чтения с карты - он всегда одинаковый.
    Ваша проблема - в выводе русских символов на экран. Чтобы видеть букву вместо квадратика кодировка символов с карты должна совпадать с кодировкой. используемой экраном.
     
    RaZZvedos, DetSimen и DIYMan нравится это.
  12. DIYMan

    DIYMan Гуру

    Ключевое слово для понимания: кодировка. Набор байт - может содержать текст в любой кодировкке, например, в UTF-8. Зная, в какой кодировке сохранен текст в файле - знаем, что надо предпринять, чтобы вывести их на экран.

    Проблема, как было совершенно справедливо замечено постом выше - не в чтении с SD, а в отсутствии понимания, как работать с кодировками символов.
     
    RaZZvedos и DetSimen нравится это.
  13. RaZZvedos

    RaZZvedos Нуб

    Т.е. язык не имеет значения? Тогда не понимаю в чем проблема. Текст сохранен в Windows1251, пробовал в UTF8, бестолку. Английские символы выводятся отлично. Цифры тоже.
    IMG_20181008_191108.jpg
    A21R23.805-03 - это как раз строка с карты. Английский+цифры. В этом же файле следующей строкой идут русские символы которые уже не читает, что в мониторе, что на экране. Я так понимаю, что раз в мониторе порта тоже квадратики, то проблема как раз в на этапе "SD-карта - массив", а не в части "массив - вывод".
    Ткните носом в чем я дурак?!=(
     
  14. parovoZZ

    parovoZZ Гуру

    Выведи данные как есть в монитор порта и кинь сюда.
     
    RaZZvedos нравится это.
  15. b707

    b707 Гуру

    Неправильно понимаете.
    Ваша логика примерно такая - "раз я не понимаю ни слова ни на корейском, ни на японском - видимо у меня что-то с ушами" :)
    На самом деле как раз то, что английские символы показываются нормально - доказывает, что с чтением с карты все в порядке.
     
    RaZZvedos и Mitrandir нравится это.
  16. b707

    b707 Гуру

    как он это сделает, если он не понимает, как это "как есть"?
    Тут надо каждую запятую разжевывать.
     
    RaZZvedos нравится это.
  17. Vovka

    Vovka Гик

    Да пусть уже перед записью на карту перекодирует русский текст, например, этой программой и все заработает! Делов-то...
    Либо второй вариант, но врядли его осилит: написать свой перекодировщик в скетче...
     
    RaZZvedos нравится это.
  18. parovoZZ

    parovoZZ Гуру

    так в абдурино же есть функция, которая выводит как есть в hex числах.
     
    RaZZvedos нравится это.
  19. RaZZvedos

    RaZZvedos Нуб

    Снимок.JPG - список как есть.
    Снимок1.JPG - как есть HEX версия.
     
    Последнее редактирование: 9 окт 2018
  20. parovoZZ

    parovoZZ Гуру

    Что там за слова написаны?
     
    RaZZvedos нравится это.