(질문에 대답 할 수 있으면 마지막 몇 줄로 세부 정보를 건너 뛸 수 있습니다.)
우분투 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는 디렉토리를 의미) 16 진수는 한국어 파일 이름의 올바른 UTF-8 코드이므로 파일 이름이 UTF-8로 인코딩 된 것으로 표시됩니다. 그러나 이제이 디렉토리 중 하나의 readdir을 수행해야한다면 (그리고 파일 이름을 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이 이름을 인코딩하는 방법을 제어 할 수있는 방법이 있습니까, 아니면 내 뒤에 물건을 인코딩하는 대신 원시 바이트로 작동하는 다른 시스템 호출을 사용할 수 있습니까? 일반적으로 어떤 수준의 인코딩이 진행되고 있는지 매우 혼란스럽고 설명이나 더 나은 점을 이해하고 싶습니다. 감사!
dirname
하고있는 new_dirname
것은 정확하므로 확실하지 않습니다.
ls
및 이외의 다른 것을 사용하여 파일에 액세스 할 수cd
있습니까?