Linux에서는 파일 이름과 경로에 어떤 문자 세트 인코딩이 사용됩니까?

Linux에서는 파일 이름과 경로에 어떤 문자 세트 인코딩이 사용됩니까?

이것이 내가 사용하는 파일 시스템에 따라 달라지나요? 예를 들어 ext2/ext3/ext4인데 ISO 9660이 포함된 "joliet" CD-ROM을 넣으면 어떻게 됩니까? POSIX에 일종의 파일 이름 문자 집합 인코딩 사양이 포함되어 있다고 들었습니다.

본질적으로 제가 알고 싶은 것은 UTF-8로 인코딩된 파일 이름을 얻은 경우 이를 Linux의 파일 I/O API에 전달하기 전에 어떤 처리/변환을 수행해야 합니까?

답변1

다른 사람들이 지적했듯이 이에 대한 실제 대답은 없습니다. 파일 이름과 경로는 인코딩되지 않습니다. 운영 체제는 바이트 시퀀스만 처리합니다. 개별 응용 프로그램은 특정 방식으로 인코딩된 것으로 해석하도록 선택할 수 있지만 이는 다양합니다.

특히, Glib(Gtk+ 애플리케이션에서 사용됨)모든 파일 이름은 사용자의 로케일에 관계없이 UTF-8로 인코딩된 것으로 가정됩니다.. 이는 환경 변수에 의해 재정의될 수 있습니다.G_FILENAME_ENCODING그리고G_BROKEN_FILENAMES.

반면에 Qt는 기본값으로모든 파일 이름이 현재 사용자의 로캘로 인코딩되어 있다고 가정합니다.. 개별 응용 프로그램은 이 가정을 재정의하도록 선택할 수 있지만 그렇게 하는 경우는 없으며 외부 재정의 스위치도 없습니다.

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

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

답변2

Linux의 unix/posix 계층은 어떤 인코딩을 사용하는지 상관하지 않습니다. 현재 인코딩된 바이트 시퀀스를 있는 그대로 저장합니다.

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

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

답변3

파일 시스템을 어떻게 마운트했는지에 따라 다릅니다 . man mount.example iso9660을 보면 vfat및 옵션이 fat있습니다 .iocharsetutf8

관련 정보