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_ENCODING 및 G_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, vfat및 fat이 iocharset와 utf8옵션을 제공합니다.


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

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