Linux에서 파일 이름 및 경로에 사용되는 문자셋 인코딩은 무엇입니까? 달라 집니까?

사용하는 파일 시스템에 따라 달라 집니까? 예를 들어, ext2 / ext3 / ext4뿐만 아니라 ISO 9660과 함께 “joliet”CD-ROM 중 하나를 삽입하면 어떻게됩니까? POSIX에 파일 이름의 문자셋 인코딩에 대한 일종의 사양이 포함되어 있다고 들었습니다.

본질적으로 UTF-8로 인코딩 된 파일 이름을 얻었는지 궁금한 점은 Linux의 파일 I / O API에 전달하기 전에 어떤 처리 / 변환을 수행해야합니까?



답변

다른 사람들이 지적했듯이 실제로 이에 대한 대답은 없습니다. 파일 이름과 경로에는 인코딩이 없습니다. OS는 일련의 바이트 만 처리합니다. 개별 응용 프로그램은 어떤 식 으로든 인코딩 된 것으로 해석하도록 선택할 수 있지만 이는 다양합니다.

특히 Glib (Gtk + 앱에서 사용) 는 사용자의 로캘에 관계없이 모든 파일 이름이 UTF-8로 인코딩 된 것으로 가정합니다 . 환경 변수 G_FILENAME_ENCODINGG_BROKEN_FILENAMES 로 재정의 될 수 있습니다 .

반면, Qt 는 모든 파일 이름이 현재 사용자의 로케일로 인코딩되었다고 가정합니다 . 개별 응용 프로그램은이 가정을 무시하도록 선택할 수 있지만 그에 대해서는 알지 못하며 외부 재정의 스위치가 없습니다.

최신 Linux 배포판은 모든 사용자가 UTF-8 로켈을 사용하도록 설정되고 외부 파일 시스템 마운트의 경로가 UTF-8로 변환되므로 전략의 이러한 차이는 일반적으로 영향을 미치지 않습니다. 그러나 실제로 안전을 원한다면 “NUL 종료, ‘/’구분 바이트 시퀀스”이외의 파일 이름에 대한 구조를 가정 할 수 없습니다.

(또한 참고 : 로케일은 프로세스에 따라 다를 수 있습니다. 동일한 사용자가 실행하는 두 개의 서로 다른 프로세스는 단순히 다른 환경 변수를 설정하여 다른 로케일에있을 수 있습니다.)


답변

리눅스의 유닉스 / 포스 레이어는 어떤 인코딩을 사용하든 상관 없습니다. 현재 인코딩의 바이트 시퀀스를 그대로 저장합니다.

이러한 마운트 옵션은 문자 세트를 정의하는 특정 파일 시스템을 시스템 문자 세트로 변환하는 데 도움이된다고 생각합니다. CDROM, NTFS 및 FAT 변형은 일부 유니 코드 변형을 사용합니다.

유닉스가 시스템 전역 인코딩을 정의하기를 원하지만 실제로는 사용자 별 설정입니다. 따라서 다른 인코딩을 정의하면 동료가 파일 이름이 다르게 표시됩니다.


답변

파일 시스템을 마운트하는 방법에 따라 다른 파일 시스템의 마운트 옵션을 살펴보십시오 man mount. 예를 들어 iso9660, vfatfatiocharsetutf8옵션을 제공합니다.


답변