it-swarm-ko.tech

Linux에서 파일 이름 및 경로에 어떤 문자 집합 인코딩이 사용됩니까?

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

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

47
martin

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

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

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

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

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

50
ephemient

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

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

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

11
Bert Huijben

파일 시스템을 마운트하는 방법에 따라 man mount에서 다른 파일 시스템에 대한 마운트 옵션을 살펴보십시오. 예를 들어 iso9660, vfatfat에는 iocharsetutf8 옵션이 있습니다.

5
Adam Byrtek