(質問に答えることができれば、最後の数行まで詳細をスキップできます。)
Ubuntu 12.04を使用しています。過去に投稿した古い質問を解決しようとしています(気になった場合:https://superuser.com/questions/339877/trouble-viewing-files-with-non-english-names-on-hard-disk/339895#339895)。 Linux、Mac、HFS+、および韓国語名のファイル間に既知の互換性の問題があり、最終的に一種の回避策を見つけるために今日一日中過ごしました。
デフォルトでは、LinuxにHFS +ドライバをインストールしました。通常の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エンコーディングとして保存されているようです。これは、16進数が韓国語ファイル名の正しいUTF-8コードであるためです。ただし、次のディレクトリのいずれかを読むと(後で何も起こらないように注意深くするために16進ファイル名を使用します):
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が私が提供したファイル名を取得して正しいディレクトリエントリと一致する場合、インデックスノードを見つけるのに問題がないと思うので、これは私を混乱させます。そしてディレクトリを開きます。これは、opendirがファイル名に対して完全に正直ではないことを示すようです。
opendirが報告したディレクトリエントリのファイル名は、ディスク上の実際のファイル名ではありません(つまり、エンコードされていますか?)。もしそうなら、opendirとreaddirが名前をエンコードする方法を制御したり、後ろからコンテンツをエンコードするのではなく、rawバイトを処理する別のシステムコールを使用する方法はありますか?通常、どのレベルのエンコーディングが発生するかは非常に混乱しています。これをよりよく理解できるように、説明や参考にしていただきありがとうございます。ありがとうございます!
答え1
opendir
デフォルトではバイト単位で動作readdir
します。彼らは演奏も録音もしません。
一部のファイルシステムドライバはバイトシーケンスに制限を加えることができます。たとえば、HFS+ は独自の Unicode 正規化スキームを使用してファイル名を正規化します。ただし、OPのようににreaddir
渡されたときに返されたフォームは正しく機能したいと思います。opendir
Ubuntuフォーラムトピックそれjw013 言及する、HFS+ドライバにバグがあるようです。これは唯一のプログラムではありませんHFS +のハングルはこのエラーを引き起こします。でもOSX困ったようです。Unicode標準化。