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


45

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

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


아래 답변은 OS와 파일 시스템이 인코딩에 신경 쓰지 않는다고 말합니다. HFS +와 같은 일부 파일 시스템은 상당한주의를 기울입니다. HFS +는 내부적으로 UTF-16의 제한된 방언으로 변환하는 UTF-8이 필요하다고 생각합니다. NTFS에도 비슷한 문제가 있지만 자세한 내용은 명확하지 않습니다.
zmccord

HFS +는 또한 이름을 분해해야하는데, 이는 리눅스가 사전 구성을 사용하는 경향이 좋지 않습니다. web.archive.org/web/20080518105836/http://developer.apple.com/...
user12439

답변:


49

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

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

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

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

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


1
"NUL로 끝나는 '/'로 구분 된 바이트 시퀀스"그러나 인코딩이 없으면 '/'을 나타내는 바이트를 어떻게 알 수 있습니까?

1
@Jack 항상 '\x2F'어떻게 생겼는지에 관계없이 /. SJIS에서는 특히 다릅니다.
ephemient

1
아, 알았어요 해당 정보로 답변을 업데이트 하시겠습니까? 어쩌면 최근에 문자셋 변환 라이브러리에서 작업했기 때문일 수도 있지만 " '/'-구분 된 바이트 시퀀스"라는 문구는 의미가 없습니다.

그렇다면 HEX의 SSH 세션에서 파일 이름 바이트를 보는 방법은 무엇입니까?
어두워

11

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

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

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


그렇다면 사용자가 현재 사용중인 로케일을 확인하고 새 파일의 로케일로 변환하여 노틸러스 등에서 파일 이름을 올바르게 볼 수 있도록해야합니다. 현재 사용자의 현재 파일 이름 문자 세트가 무엇인지 어떻게 알 수 있습니까?
마틴

1
@martin 그렇게 간단하지도 않습니다. env 변수와 작성된 언어에 따라 프로세스마다 다른 인코딩을 사용할 수 있습니다.
Basic

5

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


따라서 utf8을 사용하여 마운트하면 utf8도 open () syscall에 전달해야합니까?
마틴

또한 파일 이름의 문자 세트 인코딩이 설정된 로케일에 따라 다르다는 것을 나타내는 것으로 보이는 이 ( library.gnome.org/devel/glib/unstable/… ) 찾았습니다 .
마틴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.