Русские имена файлов на SD карте

mr_smit
Offline
Зарегистрирован: 25.12.2020

Нужно вывести в UART список файлов и папок на SD карте. Как вывести разобрался. Английские буквы выводит нормально (длинные имена тоже), а вот вместо русских знаки вопросов. Как то это можно победить?

Использую библиотеку SD FAT, Arduino Nano, карта подключена по SPI.

 

      // List files in root directory.
      if (!dirFile.open("/", O_RDONLY)) {
        sd.errorHalt("open root failed");
      }

      while (file.openNext(&dirFile, O_RDONLY)) {

        // Skip hidden files.
        if ( !file.isHidden()) {

          file.printName(&Serial);
          Serial.println();

        }
        file.close();
      }
      dirFile.close();

 

rkit
Offline
Зарегистрирован: 23.11.2016

установить правильную кодировку в терминале

mr_smit
Offline
Зарегистрирован: 25.12.2020

Нет. Дело не в этом. В терминал уже приходят знаки вопросов.

mr_smit
Offline
Зарегистрирован: 25.12.2020

На STM32 в библиотеке от Чана я использовал свой перекодировщик. А тут это не срабатывает.

          for ( i = 0; i < strlen(fl_name) ; i ++ ) {   // #define FF_LFN_UNICODE 0
            code = fl_name [i];                         // #define FF_CODE_PAGE 866  (Таблица CP 866 DOS)
            // соотносим номера русских символов из двух таблиц
            if (code >= 128 && code <= 175) {        // 80 - AF  ->  А - п (cp866)
              convert = code + 64;                   // C0 - EF  ->  А - п (win1251)
            }
            else if (code >= 224 && code <= 239) {   // E0 - EF  ->  р - я (cp866)
              convert = code + 16;                   // F0 - FF  ->  р - я (win1251)
            }
            else if (code == 240) {                  // F0 ->  Ё (cp866)
              convert = 168;                         // A8 ->  Ё (win1251)
            }
            else if (code == 241) {                  // F1 ->  ё (cp866)
              convert = 184;                         // B8 ->  ё (win1251)
            }
            else if (code == 252) {                  // FC -> № (cp866)
              convert = 185;                         // B9 -> № (win1251)
            }
            else {
              convert = code;                        // латиницу оставляем как есть
            }

            conv_fl_name[i] = convert;

          }
          Serial.write(conv_fl_name);
          Serial.println();

 

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

А SD FAT вообще поддерживает символы, не входящие в ASCII?

Ну и, опять же, откуда уверенность, что именно 866, а не, скажем, utf-8?

mr_smit
Offline
Зарегистрирован: 25.12.2020

andriano пишет:

А SD FAT вообще поддерживает символы, не входящие в ASCII?

Видимо нет. Поэтому и спрашиваю можно ли что то с этим сделать. Или может какая другая штатная библиотека есть?

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

Сделать всегда можно - написать свое, что устраивает. Другое дело, стоит ли овчинка выделки.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Стандарт на FAT - имена в кодировке первой половине таблицы аски, длина имени 13 символов (включая расширение) всё остальное извращения от гейтца

mr_smit
Offline
Зарегистрирован: 25.12.2020

Это всё чудесно и прекрасно. Как русские названия с флешки прочитать? Или "средствами Ардуины" это невозможно?

b707
Offline
Зарегистрирован: 26.05.2017

mr_smit пишет:

Это всё чудесно и прекрасно. Как русские названия с флешки прочитать? Или "средствами Ардуины" это невозможно?

не называть файлы кириллицей...

Я и в Винде-то стараюсь кириллицу не использовать

mr_smit
Offline
Зарегистрирован: 25.12.2020

b707 пишет:

не называть файлы кириллицей...

На карте музыка в mp3. Но не все названия на английском.

kalapanga
Offline
Зарегистрирован: 23.10.2016

mr_smit, во-первых, задавая вопрос о библиотеке, не грех бы давать на неё ссылку. Может, кому не лень, у себя бы попробовал (у меня, к сожалению, сейчас sd-карточку тыкать некуда). Судя по коду у Вас библиотека не та, что идёт вместе с IDE.

Во-вторых, ну вот получили Вы в программе имя файла - так посмотрите на него! Выведите эту строку побайтно, "в циферках". Хоть узнаете, что там за кодировка! Или будет понятно, что от имени ничего не осталось. А то перекодирую то, не знаю что.

Ну и в-третьих, про то, что в известных библиотеках поддерживаются имена только в формате 8.3 надеюсь помнните.

 

ratman
Offline
Зарегистрирован: 11.10.2015

kalapanga пишет:

Ну и в-третьих, про то, что в известных библиотеках поддерживаются имена только в формате 8.3 надеюсь помнните.

SdFat Version 2 supports FAT16/FAT32 and exFAT SD cards. It is mostly backward compatible with SdFat Version 1 for FAT16/FAT32 cards.

mr_smit
Offline
Зарегистрирован: 25.12.2020

1. https://github.com/greiman/SdFat  версия 1.1.4 (потому что со второй версией не компилировалось)

2. Знаки вопроса возвращает сама библиотека (во втором сообщении об этом писал).

3. Длинные имена конкретно в этой библиотеке поддерживаются.

Я всё это уже попробовал и проверил.

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

И эту картинку с hex ты получил, скопировав текст из терминала?

mr_smit
Offline
Зарегистрирован: 25.12.2020

Нет. Посмотрел сырые данные в COM Port Toolkit

mr_smit
Offline
Зарегистрирован: 25.12.2020

Это не проблема терминала. Проблема в библиотеке. Что она не поддерживает нужную кодировку. В библиотеке от Чана http://elm-chan.org/fsw/ff/00index_e.html в исходниках четко прописано что если кодировка не определена, то возвращать вместо символа - "?". В SD Fat бегло посмотрел, не нашел этого, но скорее всего тоже где то это прописано. Но у Чана есть таблицы кодировок и там можно без проблем использовать русский язык.

Поэтому я изначально и спросил есть ли какие то "правильные" библиотеки в Arduino IDE, чтобы прочитать кириллицу в имени файла на SD карте.

P.S. Добавил FatFs библиотеку. Пишет что только под 32-х битную архитектуру (stm32, esp8266). Попробовал PetitFS библиотеку. Она с длинными именами не хочет работать.

В общем похоже что никак на ардуине этого не сделать.

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

mr_smit пишет:

P.S. Добавил FatFs библиотеку. Пишет что только под 32-х битную архитектуру (stm32, esp8266). Попробовал PetitFS библиотеку. Она с длинными именами не хочет работать.

В общем похоже что никак на ардуине этого не сделать.

Arduino Due вполне себе 32-разрядная. Да и семейства stm32 и esp - тоже имеют поддержку со стороны Arduino IDE, а потому могут рассматриваться как разновидности Arduino.

Так что при необходимости все можно сделать. Другое дело - есть ли необходимость? IMHO практически во всех реальных случаях вполне достаточно ASCII 8.3.

mr_smit
Offline
Зарегистрирован: 25.12.2020

andriano пишет:
Так что при необходимости все можно сделать. Другое дело - есть ли необходимость?

Есть.

Habahaba
Offline
Зарегистрирован: 10.02.2021

Могу ошибаться, но вроде здесь меняет на знак '?'. Файл FatFileLFN.cpp

static bool lfnGetName(ldir_t *ldir, char* name, size_t n) {
  uint8_t i;
  size_t k = 13*((ldir->ord & 0X1F) - 1);
  for (i = 0; i < 13; i++) {
    uint16_t c = lfnGetChar(ldir, i);
    if (c == 0 || k >= n) {
      break;
    }
    name[k++] = c >= 0X7F ? '?' : c;
  }
  // Terminate with zero byte if name fits.
  if (k < n && (ldir->ord & LDIR_ORD_LAST_LONG_ENTRY)) {
    name[k] = 0;
  }
  // Truncate if name is too long.
  name[n - 1] = 0;
  return true;
}

 

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

mr_smit пишет:

andriano пишет:
Так что при необходимости все можно сделать. Другое дело - есть ли необходимость?

Есть.

Ну тогда, думаю, Вам в раздел "Ищу исполнителя".

SuperXL
Offline
Зарегистрирован: 30.12.2011

Еще актуально ?

P.S. удалось победить русские имена файлов.

 

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

А зачем Ардуине "русские имена файлов"?

SuperXL
Offline
Зарегистрирован: 30.12.2011

Чтоб не заниматься рукоблудием при переименовывании тучи русских файлов, песен например, лежащих на карточке. 

Предположу, что и Вам не нравится, когда магнитола в машине выдает крякозябры вместо названия песни.

 

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

А какое отношение "магнитола в машине" имеет к Ардуино?

SuperXL
Offline
Зарегистрирован: 30.12.2011

Никакого. Пример с магнитолой был риторическим, чтобы подчеркнуть общее неудовольствие от происходящего.

Если мы читаем с карточки, значит хотим увидеть все, что там есть, и в том виде в котором привыкли видеть.

Если мы пишем на карточку, значит хотим чтобы записанная инфа была понятна как нам, так и Ардуине.

Ваш КЭП )))

 

rkit
Offline
Зарегистрирован: 23.11.2016

SuperXL пишет:

Если мы пишем на карточку, значит хотим чтобы записанная инфа была понятна как нам, так и Ардуине.

Ну и пиши понятную ардуино информацию, вместо файлов с русскими именами.

SuperXL
Offline
Зарегистрирован: 30.12.2011

rkit пишет:

... вместо файлов с русскими именами.

Чем Вам не угодили файлы с русскими именами ?

rkit
Offline
Зарегистрирован: 23.11.2016

Мне всем угодили. Это ТВОЙ критерий - понятность ардуине.

SuperXL
Offline
Зарегистрирован: 30.12.2011

Мой критерий - понятность нам и Ардуине.

rkit
Offline
Зарегистрирован: 23.11.2016

И Вашему Величеству не понятны собственные файлы, если они не названы по-русски?

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

SuperXL пишет:

Если мы читаем с карточки, значит хотим увидеть все, что там есть, и в том виде в котором привыкли видеть.

Если мы пишем на карточку, значит хотим чтобы записанная инфа была понятна как нам, так и Ардуине.

Отнюдь.

Те файлы, которые хранятся на карточке внутри Ардуины - исключительно ее внутреннее дело, и они не обязаны быть понятны никому кроме самой Ардуины.

Еще раз: МК - не ПК. Он не является универсальным устройством. Он предназначен для выполнения исключительно одной единственной программы - своей прошивки. А эта программа в свою очередь нужна для управления конкретным устройством, а не в качестве универсального обработчика информации. Для этого у МК слишком мало памяти.

SuperXL
Offline
Зарегистрирован: 30.12.2011

rkit пишет:

И Вашему Величеству не понятны собственные файлы, если они не названы по-русски?

Мне фиолетово, как названы файлы, мое устройство не видело файлов в именах которых была кириллица. Теперь видит, корректно отображает, поэтому я и спросил автора темы - актуален ли еще вопрос.

andriano пишет:

Отнюдь.

Те файлы, которые хранятся на карточке внутри Ардуины - исключительно ее внутреннее дело, и они не обязаны быть понятны никому кроме самой Ардуины.

Еще раз: МК - не ПК. Он не является универсальным устройством. Он предназначен для выполнения исключительно одной единственной программы - своей прошивки. А эта программа в свою очередь нужна для управления конкретным устройством, а не в качестве универсального обработчика информации. Для этого у МК слишком мало памяти.

Спорное утверждение.

У Ардуины нет своей "карточки" (внутренняя память не в счет), а те карточки, которые вставляют в конкретное устройство (например аудиоплеер), которым рулит Ардуина выполняя свою прошивку, могут содержать имена файлов с русскими именами.

У МК достаточно памяти, чтобы выполнять ту задачу которую задумал автор устройсва, в том числе быть универсальным обработчиком информации. Если это не так, выбирается другой МК. ПК это совокупность МК.

 

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

SuperXL пишет:

...а те карточки, которые вставляют в конкретное устройство (например аудиоплеер), которым рулит Ардуина выполняя свою прошивку

Вы во второй раз упоминаете аудиоплеер.

Но Ардуина - не аудиоплеер, и делать универсальный аудиоплеер на Ардуине бессмысленно, т.к. он по всем параметрам будет уступать заводскому устройству.

Постарайтесь придумать более вменяемый пример.

Цитата:

, могут содержать имена файлов с русскими именами.

Да откуда ж они там возьмутся?

Я могу понять, когда аудиоплеер, управляемый Ардуино, озвучивает что-то вроде говорящих часов или другого разговаривающего робота, но в этом случае набор файлов изначально задается разработчиком и не изменяется в процессе работы.

Цитата:

У МК достаточно памяти, чтобы выполнять ту задачу которую задумал автор устройсва, в том числе быть универсальным обработчиком информации. Если это не так, выбирается другой МК.

Нет, МК выбирается под конкретную задачу, а не так, чтобы хватило на все случаи жизни. И в качестве универсального обработчика информации МК не подходит.

Простой пример: сравним типичные 8-разрядные МК и ПК. У первого производительность порядка 16 млн оп/с и ОЗУ 1-2 кбайта, а у второго - 0.3 млн оп/с и 64 кбайта. МК - универсальный обработчик информации, поэтому при в 50 раз более низкой призводительности у него в те же 50 раз больше памяти - в аккурат по решаемой задаче (быть универсальным обработчиком информации).

Цитата:

ПК это совокупность МК.

Отнюдь. В ПК отдельные узлы (типа клавиатуры) могут быть изготовлены на МК, но ЦП к МК никакого отношения не имеет, - у него другие задачи, другой баланс характеристик и другая архитектура.

Upper
Offline
Зарегистрирован: 23.06.2020

andriano пишет:

Постарайтесь придумать более вменяемый пример.

Вы правда не можете сами придумать пример, где может потребоваться обработка русских имен файлов?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Upper пишет:

andriano пишет:

Постарайтесь придумать более вменяемый пример.

Вы правда не можете сами придумать пример, где может потребоваться обработка русских имен файлов?

Не скажу, как Сергей, но я - нет, не могу. Я делаю карточку для Ардуино. Специально для Ардуино. Откуда там взяться кириллическим именам файлов? Я же сам делаю эту карту, зачем мне кириллица??? Я умею говорить на человеческом языке ;)) (это троллинг)

Я очень много лет с компьютерами. Часто по службе исполнял параллельно функции админа. У меня и на компе кириллические  имена появились только с приходом UTF и в винду тоже. Иначе можно было убить контрагентов, которые присылали архивы с кодировкой 1251, когда я работал на Линухе постоянно.

Во времена, когда я был ГИП и руководитель проектного отдела (сооружения связи всякие строили) я просто отправлял Заказчиков нахер, если во вложении почты были кириллические имена файлов.

SuperXL
Offline
Зарегистрирован: 30.12.2011

andriano пишет:

Я могу понять, когда аудиоплеер, управляемый Ардуино, озвучивает что-то вроде говорящих часов или другого разговаривающего робота, но в этом случае набор файлов изначально задается разработчиком и не изменяется в процессе работы.

Мне кажется, я понял почему идет такая полемика.

Разрешите задать Вам наводящий вопрос: - Что Вы называете Ардуино?

SuperXL
Offline
Зарегистрирован: 30.12.2011

wdrakula пишет:

... я просто отправлял Заказчиков нахер, если во вложении почты были кириллические имена файлов.

Напомнило.

- Блин, чё делать то ?..

- А я фиг его знает...

- Может в отдел техподдержки позвоним ?

- Неееее, там злой админ сидит.

))))

rkit
Offline
Зарегистрирован: 23.11.2016

Upper пишет:

Вы правда не можете сами придумать пример, где может потребоваться обработка русских имен файлов?

Ну ты не смог, причем уже с нескольких попыток.

Upper
Offline
Зарегистрирован: 23.06.2020

rkit пишет:

Upper пишет:

Вы правда не можете сами придумать пример, где может потребоваться обработка русских имен файлов?

Ну ты не смог, причем уже с нескольких попыток.

Похоже у вас трудности с обработкой русского текста. Какие попытки вы имеете в виду?

It looks like you are having difficulties with processing Russian text. What attempts do you mean?

P.S. Или вы перепутали ники написанные латиницей?

rkit
Offline
Зарегистрирован: 23.11.2016

Это замечательно, только примера я так и не вижу.

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

Upper пишет:

andriano пишет:

Постарайтесь придумать более вменяемый пример.

Вы правда не можете сами придумать пример, где может потребоваться обработка русских имен файлов?

Не могу.

Влад - тоже не может.

rkit, судя по всему, - тоже.

Да и Вы, скорее всего, также не можете, иначе бы не пытались переадресовать вопрос.

 

PS. В хобби/DIY существует такое направление - создание безусловно бесполезных устройств. Типа: "А вот смотрите, как я еще могу!" Ну, начиная с известной useless box и вплоть до устройства, которое берет из пачки А4 очередной лист, складывает из него бумажный самолетик и запускает.

Вот, мне кажется, то, о чем Вы говорили в сообщении №21, относится именно к этому классу, но Вы, почему-то, упорно пытаетесь доказать его утилитарную полезность.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

SuperXL пишет:

andriano пишет:

Разрешите задать Вам наводящий вопрос: - Что Вы называете Ардуино?

Очень смешно, с учетом того, что ты задал вопрос одному из тех старожил форума, которые много работали именно с мощными вариантами Ардуина, на ARM ядре.

----------------

Короче так. Тебе пытаются объяснить, почему среди известных нет библиотеки, которая понимает UTF в именах файлов на SD карте. Можно ли написать? Да. И я и Андриано и Ркит и многие другие  - напишут такую за полдня-день, много - два. Заказывай в "Ищу исполнителя", если у кого-то из старожил найдется время и цена заинтересует - напишем. Готовой нет, потому, что нахер никому не нужна. Как-то так.

SuperXL
Offline
Зарегистрирован: 30.12.2011

andriano пишет:

Вот, мне кажется, то, о чем Вы говорили в сообщении №21, относится именно к этому классу, но Вы, почему-то, упорно пытаетесь доказать его утилитарную полезность.

В сообщении №21 я (SuperXL) спросил автора темы о том, что актуален ли еще вопрос для него про русские имена файлов. В пост-скриптуме я указал, что данный вопрос удалось порешать. 

в том сообщении я ничего не пытался доказать, но, я так понимаю, мне посыпались вопросы про необходимость русских имен файлов. Да, аудио плеер наверное один из единственных девайсов которым нужна необходимость умения открывать и отображать названия русских/китайских/итд файлов. У автора темы, судя по скринам, тоже аудио плеер, ну или девайс с такой функцией. На карточке автора, мне так кажется, лежат файлы с песнями (судя по названию), и предназначены отнюдь не для озвучивания каких либо действий или событий.

На счет хобби/DIY я с Вами согласен. Полезность той или иной самоделки выбирает сам автор этой самоделки. Если это новичек, то мигание светодиодом уже достижение по мнению новичка, и да, "Смотрите, у меня получилось !" имеет право на существование. Более опытные товарищи, если они еще не сильно зазвездились (никоим образом это выражение не относится участникам нашей беседы), скажут -  "да, молодец, тебе удалось помигать светодиодом и это лучше, чем сидеть за гаражами на "кортах" и с "семками", изучай дальше - это интересно".

wdrakula пишет:

...

Очень смешно, с учетом того, что ты задал вопрос одному из тех старожил форума, которые много работали именно с мощными вариантами Ардуина, на ARM ядре.

К сожалению у меня не отображается карма и почет участников, а только дата регистрации. Возможно по этому и был задан наводящий вопрос, чтобы мне понимать почему возникает такая полемика и как-то понимать уровень подготовки человека. Я своим вопросом никоим образом не пытался как-то обидеть/оскорбить/унизить человека с ником andriano да и в принципе всех тут присутствующих.

wdrakula пишет:

Короче так. Тебе пытаются объяснить, почему среди известных нет библиотеки, которая понимает UTF в именах файлов на SD карте. Можно ли написать? Да. И я и Андриано и Ркит и многие другие  - напишут такую за полдня-день, много - два. Заказывай в "Ищу исполнителя", если у кого-то из старожил найдется время и цена заинтересует - напишем. Готовой нет, потому, что нахер никому не нужна. Как-то так.

Я так понимаю это тоже мне адресовано, т.к. в этой ветке, походу уже "перемешались люди кони". 

Если я своими действиями, как-то отбираю Ваш хлеб (ну или "калымы/шабашки") прошу у Вас прощения. К чему я это. Просто Вы, как и andriano, в сообщении №20, предлагаете обратиться в раздел "Ищу исполнителя".

Форум на то и форум, чтоб общаться и делится информацией по интересам. Причем данное утверждение приводили Вы же в далеком 17 году. Позвольте Вас процитировать: "1.Смысл форумов в том, что на них общаются ПО ИНТЕРЕСАМ. А для ответов на вопросы существуют поисковые системы. Неожиданно, да?".

 

wdrakula пишет:
"Короче так. Тебе пытаются объяснить, почему среди известных нет библиотеки, которая понимает UTF в именах файлов на SD карте."

- Есть. о чем я и написал в посте №21. Пруфы в студию, или поверите наслово )) ?

 

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

SuperXL пишет:

...один из единственных девайсов которым нужна необходимость...

Ограничусь только этой цитатой.

 

SuperXL, насколько я понимаю, Вы решили для себя проблему аналогичную той, которой интересовался ТС. Если считаете, что Ваше решение может кому-то оказаться полезным и, кроме того, оно оформлено в более или менее законченном виде, разместите его в "Проектах".

Вот лично я, хотя к подобным вещам отношусь с изрядным скепсисом, но опубликовал в проектах http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8 , надо же, кому-то это, судя по отзывам, пригодилось.

negavoid2
negavoid2 аватар
Offline
Зарегистрирован: 06.05.2020

Забыли ещё, что в windows utf-16, а в линуксах utf-8 или любая другая по желанию пользователя.

SuperXL
Offline
Зарегистрирован: 30.12.2011

Спасибо за рекомендацию (это не сарказм, это действительно благодарность).

Это не мое решение, это теперь штатная функция библиотеки SdFat от Bill Greiman. Только она выключена по умолчанию.

Для того чтобы ее включить, надо в файле SdFatConfig.h убрать комментарий со строк 37 и 42 и проверить чтобы на конце этих строк стояла 1.