MementoMori 4 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба Добрый вечер. Ковыряю FatFS R0.12c Не получается читать русские буквы. Настраиваю так #define FF_CODE_PAGE 866#define FF_USE_LFN 2#define FF_LFN_UNICODE 0 Ну или #define FF_CODE_PAGE 855 Вместо русских букв белеберда. Хотя в библиотеке есть не просто кириллица (855), но и "Russian" - 866. Что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 1 hour ago, MementoMori said: Хотя в библиотеке есть не просто кириллица (855), но и "Russian" - 866. Это кодовая таблица DOS. А чем смотрите? Нет ли при просмотре интерпретации как CP1251 (windows) или UTF8? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 1 час назад, MementoMori сказал: Вместо русских букв белеберда. Что я делаю не так? Так посмотрите что в FAT записано в шестнадцатиричных кодах и сопоставьте в какой кодировке названия файлов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 22 minutes ago, mdmitry said: А чем смотрите? Нет ли при просмотре интерпретации как CP1251 (windows) или UTF8? Вывожу через uart. 30 minutes ago, mdmitry said: Нет ли при просмотре интерпретации как CP1251 (windows) или UTF8? Вот как выглядит файл "абвгдеж.txt" Это наверное и правда win1251 161->193 162->194 163->195 и дальше по тексту. Я когда искал решение своей проблемы, наткнулся на тему, где товарищ сетовал, что у него русские буквы читаются только если указать cp1251, но это в версии FatFS 0.12b, а он хочет Fat 0.13. Китайцы ему ответитили, что 0.12b- последняя версия, которая поддерживает cp1251. У меня версия 0.12c (то есть уже не b) Я создавал файлы ручками, из под винды. Так же может сделать и пользователь. Что же это получается, последняя версия принципиально не годится для русского Ивана? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 18 декабря, 2020 Опубликовано 18 декабря, 2020 · Жалоба 10 hours ago, HardEgor said: Так посмотрите что в FAT записано в шестнадцатиричных кодах и сопоставьте в какой кодировке названия файлов. Спас вот такой костыль for(uint8_t i=0; i<strlen(fn);i++) { if ((fn[i]>=128) && (fn[i]<=175)) fn[i]+=64; //A...Я,а..п else if ((fn[i]>=224) && (fn[i]<=239)) fn[i]+=16; //р..я else if (fn[i]==240) fn[i]=168; // Ё else if (fn[i]==241) fn[i]=184;// ё } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 18 декабря, 2020 Опубликовано 18 декабря, 2020 · Жалоба 11 минут назад, MementoMori сказал: Спас вот такой костыль А какие проблемы добавить таблицу в код? Там же несколько таблиц, значит оформлены отдельными блоками. Скорее всего надо просто скопировать файл из 0.12b в 0.13 и в настройках добавить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 18 декабря, 2020 Опубликовано 18 декабря, 2020 · Жалоба 4 minutes ago, HardEgor said: А какие проблемы добавить таблицу в код? Вот товарищ http://forum.easyelectronics.ru/viewtopic.php?f=35&t=33457 (вроде бы его ник видел и на этом форуме) пишет Раньше я решал эту проблему подсовыванием нужных макросов/таблиц из каких-то старых версий FatFS, где Win1251 ещё была. Но оказалось, что в R0.13 (может одной-двух предыдущих - не знаю) сильно изменилась система перекодировок и просто подсунуть нужные таблицы не получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 4 18 декабря, 2020 Опубликовано 18 декабря, 2020 · Жалоба 12 часов назад, MementoMori сказал: Что же это получается, последняя версия принципиально не годится для русского Ивана? А должна? Русский Иван, как всегда, ждёт, что за него всё китайцы сделают? Пусть свою ФАТ напишет и не жалуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 18 декабря, 2020 Опубликовано 18 декабря, 2020 · Жалоба 43 minutes ago, Herz said: что за него всё китайцы сделают? Так если бы этой кодировки не было вообще, а то ж ведь до 0.12С была, а потом пропала. 43 minutes ago, Herz said: Пусть свою ФАТ напишет и не жалуется. Так русский Иван набросал функцию перекодирования, но все же недоумевает, почему китайский Хунь так кастрировал свое творение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 20 декабря, 2020 Опубликовано 20 декабря, 2020 · Жалоба Вопрос следующий. Получил я текст, читаемый в cp1251, записанный в переменную fn, представляющую собой массив uint8_t. Хочу вывести его в виджет библиотеки TouchGFX рукописной функцией SetItemFName(fn); Но загвоздка в том, что нужен юникод, для этого, как я понял из таблицы кодировок, нужно прибавить к символу число 848. Соответственно нужно преобразовать в uint16_t пытаюсь это сделать. У меня строка "абвгд", то есть последовательость 0xE0, 0xE1, 0xE2, 0xE3, 0xE4. Преобразовываю SetItemFName((uint16_t*)fn) Получаю массив не из 0x00E0,0x00E1,0x00E2,0x00E3, а нечто иное - 0xE1E0, 0xE3E2,0xE5E4. Я конечно уже сделал все ручками, побайтово заполнив массив в цикле, но что-то мне подсказывает, что есть более изящное решение. Есть ли оно и каково оно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 20 декабря, 2020 Опубликовано 20 декабря, 2020 · Жалоба 2 hours ago, MementoMori said: Есть ли оно и каково оно? Может не совсем в тему, но у меня давно была ситуация обратная: код в eclipse UTF8 (ОС Debian), а индикатор понимал только CP866. Перекодировать в программе было неудобно, к кому же длины строк получаются разные. Сделал так: все необходимые строки собрал в один файл (.h, строки использовал через define) и перед компиляцией файл конвертировал. Собирал все с помощью make, поэтому проблем с дополнительным шагом не имел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 20 декабря, 2020 Опубликовано 20 декабря, 2020 · Жалоба 4 часа назад, MementoMori сказал: У меня строка "абвгд", то есть последовательость 0xE0, 0xE1, 0xE2, 0xE3, 0xE4. Преобразовываю SetItemFName((uint16_t*)fn) Получаю массив не из 0x00E0,0x00E1,0x00E2,0x00E3, а нечто иное - 0xE1E0, 0xE3E2,0xE5E4. Конечно он из памяти читает по два байта теперь. Вам надо проредить массив нулями. Массив должен быть в два раза больше(в байтах). А дальше с конца начинаете преобразовывать uint8_t в uint16_t Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 20 декабря, 2020 Опубликовано 20 декабря, 2020 · Жалоба 7 часов назад, MementoMori сказал: SetItemFName((uint16_t*)fn) Потелепатировав, я думаю что возможно вам проще написать процедуру SetItemFName((uint8_t* fn1), а уже внутри преобразовать uint16_t fn = fn1; Хотя телепатия ничего не сказала куда вы эти данные отправляете... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 20 декабря, 2020 Опубликовано 20 декабря, 2020 · Жалоба 7 hours ago, HardEgor said: Потелепатировав, я думаю что возможно вам проще написать процедуру SetItemFName((uint8_t* fn1), а уже внутри преобразовать uint16_t fn = fn1; Хорошо телепатируете. Не только на прием, но и на передачу - я ведь сделал именно так, как вы сейчас написали, но до прочтения вашего поста (и чуть позже после того, как он был оставлен) Угадайте мою следующую проблему и ее решение) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 21 декабря, 2020 Опубликовано 21 декабря, 2020 · Жалоба Еще один вопрос. Когда-то я писал просмотрщик папок, это было еще под DOS. Был там удобный способ переходить из директории в директорию, с помощью добавления в путь двух точек. Например если задать путь "\.." - то попадешь в предыдущую директорию. А если написать "С:\FOLDER\.." то попадешь в "С:\". И в списке файлов первая запись это "..". Удобно - парсить строку не надо. А можно ли как-то так же с FatFS? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться