Перейти к содержанию
    

Добрый вечер.

Ковыряю 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.

 

Что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, MementoMori said:

Хотя в библиотеке есть не просто кириллица (855), но и "Russian" - 866.

Это кодовая таблица DOS. А чем смотрите? Нет ли при просмотре интерпретации как CP1251 (windows) или UTF8?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, MementoMori сказал:

Вместо русских букв белеберда.

 

Что я делаю не так?

Так посмотрите что в FAT записано в шестнадцатиричных кодах и сопоставьте в какой кодировке  названия файлов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, mdmitry said:

А чем смотрите? Нет ли при просмотре интерпретации как CP1251 (windows) или UTF8?

Вывожу через uart. 

30 minutes ago, mdmitry said:

Нет ли при просмотре интерпретации как CP1251 (windows) или UTF8?

Вот как выглядит файл "абвгдеж.txt"

tcYNpNfT.png?download=1&name=%D0%A1%D0%B

Это наверное и правда win1251

 

DHT9vCWG.png?download=1&name=%D0%A1%D0%B

 

161->193

162->194

163->195  и дальше по тексту.

 

Я когда искал решение своей проблемы, наткнулся на тему, где товарищ сетовал, что у него русские буквы читаются только если указать cp1251, но это в версии FatFS 0.12b, а он хочет Fat 0.13. Китайцы ему ответитили, что 0.12b- последняя версия, которая поддерживает cp1251.    У меня версия 0.12c (то есть уже не b)

Я создавал файлы ручками, из под винды. Так же может сделать и пользователь. Что же это получается, последняя версия принципиально не годится для русского Ивана?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;// ё
				}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, MementoMori сказал:

Спас вот такой костыль

А какие проблемы добавить таблицу в код? Там же несколько таблиц, значит оформлены отдельными блоками.

Скорее всего надо просто скопировать файл из 0.12b в 0.13 и в настройках добавить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, HardEgor said:

А какие проблемы добавить таблицу в код?

Вот товарищ  http://forum.easyelectronics.ru/viewtopic.php?f=35&t=33457  (вроде бы его ник видел и на этом форуме) пишет

Раньше я решал эту проблему подсовыванием нужных макросов/таблиц из каких-то старых версий FatFS, где Win1251 ещё была.
Но оказалось, что в R0.13 (может одной-двух предыдущих - не знаю) сильно изменилась система перекодировок и просто подсунуть нужные таблицы не получается.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, MementoMori сказал:

Что же это получается, последняя версия принципиально не годится для русского Ивана?

А должна? Русский Иван, как всегда, ждёт, что за него всё китайцы сделают? Пусть свою ФАТ напишет и не жалуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 minutes ago, Herz said:

что за него всё китайцы сделают?

Так если бы этой кодировки не было вообще, а то ж ведь до 0.12С была, а потом пропала.

 

43 minutes ago, Herz said:

Пусть свою ФАТ напишет и не жалуется.

Так русский Иван набросал функцию перекодирования, но все же недоумевает, почему китайский Хунь так кастрировал свое творение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос следующий.

Получил я текст, читаемый в 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.

Я конечно уже сделал все ручками, побайтово заполнив массив в цикле, но что-то мне подсказывает, что есть более изящное решение. Есть ли оно и каково оно?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, MementoMori said:

Есть ли оно и каково оно?

Может не совсем в тему, но у меня давно была ситуация обратная: код в eclipse UTF8 (ОС Debian), а индикатор понимал только CP866. Перекодировать в программе было неудобно, к кому же длины строк получаются разные. Сделал так: все необходимые строки собрал в один файл (.h, строки использовал через define) и перед компиляцией файл конвертировал. Собирал все с помощью make, поэтому проблем с дополнительным шагом не имел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, MementoMori сказал:

У меня строка "абвгд", то есть последовательость 0xE0, 0xE1, 0xE2, 0xE3, 0xE4.

Преобразовываю SetItemFName((uint16_t*)fn)

Получаю массив не из 0x00E0,0x00E1,0x00E2,0x00E3, а  нечто иное - 0xE1E0, 0xE3E2,0xE5E4.

Конечно он из памяти читает по два байта теперь.

Вам надо проредить массив нулями. Массив должен быть в два раза больше(в байтах).

А дальше с конца начинаете преобразовывать uint8_t в uint16_t

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, MementoMori сказал:

SetItemFName((uint16_t*)fn)

Потелепатировав, я думаю что возможно вам проще написать процедуру SetItemFName((uint8_t* fn1), а уже внутри преобразовать uint16_t fn = fn1;

Хотя телепатия ничего не сказала куда вы эти данные отправляете...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, HardEgor said:

Потелепатировав, я думаю что возможно вам проще написать процедуру SetItemFName((uint8_t* fn1), а уже внутри преобразовать uint16_t fn = fn1;

Хорошо телепатируете. Не только на прием, но и на передачу - я ведь сделал именно так, как вы сейчас написали, но до прочтения вашего поста (и чуть позже после того, как он был оставлен) 

Угадайте мою следующую проблему и ее решение)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще один вопрос.

Когда-то я писал просмотрщик папок, это было еще под DOS. 

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

Например если задать путь "\.." - то попадешь в предыдущую директорию. А если написать "С:\FOLDER\.." то попадешь в "С:\".  И в списке файлов первая запись это "..". Удобно - парсить строку не надо. 

А можно ли как-то так же с FatFS?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...