사용하는 파일 시스템에 따라 달라 집니까? 예를 들어, ext2 / ext3 / ext4뿐만 아니라 ISO 9660과 함께 "joliet"CD-ROM 중 하나를 삽입하면 어떻게됩니까? POSIX에 파일 이름의 문자셋 인코딩에 대한 일종의 사양이 포함되어 있다고 들었습니다.
본질적으로 UTF-8로 인코딩 된 파일 이름을 얻었는지 궁금한 점은 Linux의 파일 I / O API에 전달하기 전에 어떤 처리 / 변환을 수행해야합니까?
사용하는 파일 시스템에 따라 달라 집니까? 예를 들어, ext2 / ext3 / ext4뿐만 아니라 ISO 9660과 함께 "joliet"CD-ROM 중 하나를 삽입하면 어떻게됩니까? POSIX에 파일 이름의 문자셋 인코딩에 대한 일종의 사양이 포함되어 있다고 들었습니다.
본질적으로 UTF-8로 인코딩 된 파일 이름을 얻었는지 궁금한 점은 Linux의 파일 I / O API에 전달하기 전에 어떤 처리 / 변환을 수행해야합니까?
답변:
다른 사람들이 지적했듯이 실제로 이에 대한 대답은 없습니다. 파일 이름과 경로에는 인코딩이 없습니다. OS는 일련의 바이트 만 처리합니다. 개별 응용 프로그램은 어떤 식 으로든 인코딩 된 것으로 해석하도록 선택할 수 있지만 이는 다양합니다.
특히 Glib (Gtk + 앱에서 사용) 는 사용자의 로캘에 관계없이 모든 파일 이름이 UTF-8로 인코딩 된 것으로 가정합니다 . 환경 변수 G_FILENAME_ENCODING 및 G_BROKEN_FILENAMES 로 재정의 될 수 있습니다 .
반면, Qt 는 모든 파일 이름이 현재 사용자의 로케일로 인코딩되었다고 가정합니다 . 개별 응용 프로그램은이 가정을 무시하도록 선택할 수 있지만 그에 대해서는 알지 못하며 외부 재정의 스위치가 없습니다.
최신 Linux 배포판은 모든 사용자가 UTF-8 로켈을 사용하도록 설정되고 외부 파일 시스템 마운트의 경로가 UTF-8로 변환되므로 전략의 이러한 차이는 일반적으로 영향을 미치지 않습니다. 그러나 실제로 안전을 원한다면 "NUL 종료, '/'구분 바이트 시퀀스"이외의 파일 이름에 대한 구조를 가정 할 수 없습니다.
(또한 참고 : 로케일은 프로세스에 따라 다를 수 있습니다. 동일한 사용자가 실행하는 두 개의 서로 다른 프로세스는 단순히 다른 환경 변수를 설정하여 다른 로케일에있을 수 있습니다.)
'\x2F'
어떻게 생겼는지에 관계없이 /
. SJIS에서는 특히 다릅니다.
리눅스의 유닉스 / 포스 레이어는 어떤 인코딩을 사용하든 상관 없습니다. 현재 인코딩의 바이트 시퀀스를 그대로 저장합니다.
이러한 마운트 옵션은 문자 세트를 정의하는 특정 파일 시스템을 시스템 문자 세트로 변환하는 데 도움이된다고 생각합니다. CDROM, NTFS 및 FAT 변형은 일부 유니 코드 변형을 사용합니다.
유닉스가 시스템 전역 인코딩을 정의하기를 원하지만 실제로는 사용자 별 설정입니다. 따라서 다른 인코딩을 정의하면 동료가 파일 이름이 다르게 표시됩니다.
파일 시스템을 마운트하는 방법에 따라 다른 파일 시스템의 마운트 옵션을 살펴보십시오 man mount
. 예를 들어 iso9660
, vfat
및 fat
이 iocharset
와 utf8
옵션을 제공합니다.