opendir и readdir кодирующие строки за моей спиной?

(Вы можете пропустить детали до последних двух строк, если сможете ответить на вопрос :))

Я на Ubuntu 12.04. Я пытаюсь решить старую проблему, о которой я писал в прошлом (если вам интересно: https://superuser.com/questions/339877/trouble-viewing-files-with-non-english-names -on-hard-disk / 339895 # 339895 ). Существует известная проблема совместимости между Linux, Mac, HFS + и корейскими файлами, и я провел весь день сегодня, пытаясь наконец найти какое-то обходное решение.

В принципе, я подключил свой HFS + диск к Linux. Нормальные ls и cd имеют проблемы с доступом к файлам, потому что они находятся на корейском языке. Поэтому я написал программу на C, чтобы попытаться получить доступ к этим файлам на самом низком уровне, поэтому я могу быть увереннее, что за моей спиной ничего не будет:

DIR* dp; struct dirent *ep; char* parent = "/media/external/Movies"; dp = opendir( parent ); if( dp != NULL ) { while( ep = readdir(dp) ) { printf( "%d %s %X\t", ep->d_ino, ep->d_name, ep->d_type ); // now print out the filenames in hex for( int i = 0; i != strlen( ep->d_name ) ; i++) { printf( "0x%X " , ep->d_name[i] & 0xff ); } printf("\n"); } closedir(dp); } else { perror("Couldn't open the directory! "); } 

Вот пример вывода, который я получаю для этого:

433949 밀양 4 0xEB 0xB0 0x80 0xEC 0x96 0x91

413680 박쥐 4 0xEB 0xB0 0x95 0xEC 0xA5 0x90

434033 박하 사탕 4 0xEB 0xB0 0x95 0xED 0x95 0x98 0xEC 0x82 0xAC 0xED 0x83 0x95

Таким образом, на поверхности, похоже, что openddir не имеет проблем с просмотром записей в каталоге. Номера inode есть, они правильно помечены как каталоги (4 означает каталог), и кажется, что имена файлов хранятся в кодировке UTF-8, так как эти шестнадцатеричные символы являются правильными кодами UTF-8 для корейских имен файлов. Но теперь, если бы я должен был сделать readdir одного из этих каталогов (и я буду использовать имя файла в гексагоне, чтобы быть более осторожным, чтобы ничего не происходило за моей спиной):

 unsigned char new_dirname[] = {'/',0xEB,0xB0,0x80,0xEC,0x96,0x91,'\0'}; unsigned char final[ strlen(parent) + strlen(new_dirname) + 1 ]; memcpy(final, parent, strlen( parent )); strcpy(final + strlen(parent), dirname ); dp = opendir( final ); // dp == NULL here!!! 

Он не может открыть каталог. Это меня задевает, потому что, если opendir просто сообщал об исходных битах имени файла в записи каталога, а readdir просто записывал мое имя файла и сопоставлял его с правильной записью каталога, я бы подумал, что не должно быть никаких проблем в поиск inode и открытие каталога. Это, по-видимому, говорит о том, что opendir не совсем честен в отношении имен файлов.

Являются ли имена файлов в записях каталога сообщенными opendir не тем, что на самом деле находится на диске (т. Е. Они закодированы)? Если это так, я могу либо контролировать, как opendir и readdir являются именами кодировки, или, возможно, использовать некоторые другие системные вызовы, которые работают с необработанными байтами вместо кодирования за моей спиной? В общем, я нахожу это очень запутанным, на каком уровне кодирования происходит, и я был бы признателен за любые объяснения или еще лучше, ссылку, чтобы понять это! Благодаря!

One Solution collect form web for “opendir и readdir кодирующие строки за моей спиной?”

opendir и readdir сами работают над байтами. Они не выполняют и не перекодируют.

Некоторые драйверы файловой системы могут накладывать ограничения на последовательности байтов. Например, HFS + нормализует имена файлов, используя проприетарную схему нормализации Unicode. Я бы ожидал, что форма, возвращаемая readdir будет работать, когда будет передана opendir , однако, так как OP в потоке форума Ubuntu, о котором упоминал jw013 , я подозреваю, что ошибка в драйвере HFS +. Это не единственная программа , которую Hangul отключил на HFS +. Даже у OSX, похоже, есть проблемы с нормализацией Unicode .

  • Почему SLES 11 развращает данные символы?
  • `^ M` в конце каждой строки текстовых файлов, сгенерированных под Windows
  • iconv не может преобразовать заданные символы
  • Почему wc -m и wc -c разные?
  • поддержка кодировки utf-8 с lpr
  • Вопросительные знаки вместо национальных букв в консоли
  • Печать десятичного символа ascii, моя команда не выводит
  • Запуск grep для строки с ненулевыми символами
  • как угадать и переименовать файл из удаленного rar имеет неверную кодировку
  • tr не заменяет апостроф
  • Как исправить кодировку символов в bash (arch linux)
  • Linux и Unix - лучшая ОС в мире.