Linux의 파일 시스템 문자 인코딩에 대한 몇 가지 질문

Linux의 파일 시스템 문자 인코딩에 대한 몇 가지 질문

Windows 간에는 파일 교환 작업이 많기 때문에(GBK인코딩) 및 Linux(UTF-8인코딩) 다음과 같은 문자 인코딩 문제가 발생하기 쉽습니다.

  • Windows 시스템에서는 zip/tar 파일명에 한자가 포함되어 있고, Linux 시스템에서는 /untar를 압축해제합니다.
  • 마이그레이션된 레거시 Java 웹 애플리케이션(JSP에서 GBK 인코딩을 사용하여 Windows 시스템에서 설계됨)을 실행하고 GBK 인코딩된 명명된 파일을 디스크에 씁니다.
  • ftp Windows FTP 서버와 Linux 클라이언트 사이에서 GBK로 인코딩된 명명된 파일을 가져오거나 넣습니다.
  • Linux에서 LANG 환경을 전환합니다.

앞서 언급한 일반적인 문제는 파일 위치/이름 지정입니다. 구글링 후 기사를 얻었습니다.Linux에서 유니코드 사용 https://www.linux.com/news/using-unicode-linux/, 그것은 말한다 :

운영 체제와 많은 유틸리티는 파일 이름의 바이트가 어떤 문자를 나타내는지 모릅니다.

따라서 동일한 이름을 가진 두 개의 파일이 있을 수 있습니다(동일한이름이 올바른 문자 세트로 디코딩될 때다른(바이트 단위), 예를 들어 中文.txt인코딩이 다릅니다.

[root@fedora test]# ls
????  中文
[root@fedora test]# ls | iconv -f GBK
中文
涓iconv: illegal input sequence at position 7
[root@fedora test]# ls 中文 && ls $'\xd6\xd0\xce\xc4' | iconv -f gbk
中文
中文

질문:

  1. 고정 문자 인코딩(예:NTFSUTF-16은 LANG/LC_ALL 환경에 관계없이 파일 이름을 저장하기 위해 내부적으로 사용됩니까?
  2. 아니면 제가 정말 묻고 싶은 것은 $'\xe4\xb8\xad\xe6\x96\x87.txt'파일 이름이 zh_CN.UTF-8 환경에서는 Chinese.txt()이고 $'\xd6\xd0\xce\xc4.txt'zh_CN.GBK 환경에서는 Chinese.txt()가 될 수 있습니까?동일한 파일 참조?
  3. 구성할 수 없는 경우 커널을 패치하여 파일 시스템과 현재 환경 간의 문자 인코딩을 변환할 수 있습니까(구현 요청이 아닌 질문일 뿐입니다)? 가능하다면 성능에 어떤 영향을 미치나요?

답변1

귀하의 질문을 순서대로 읽으면 분명한 이유 때문에 질문을 조금 다르게 표현했습니다.

1. LANG/LC_ALL 환경에 관계없이 파일 이름을 저장하기 위해 고정 문자 인코딩을 사용하도록 Linux 파일 시스템을 구성할 수 있습니까?

아니요, 불가능합니다. 질문에서 언급했듯이 UNIX 파일 이름은 단지 일련의 바이트입니다. 커널은 인코딩에 대해 아무것도 모르고 전적으로 사용자 공간(예: 응용 프로그램 수준) 개념입니다.

즉, 커널은 LANG/에 대해 아무것도 모르므 LC_*로 이를 번역할 수 없습니다.

2. 동일한 파일을 다른 파일 이름으로 참조하는 것이 가능합니까?

동일한 파일을 참조하는 여러 디렉토리 항목을 가질 수 있습니다.하드 링크또는심볼릭 링크.

그러나 현재 인코딩에서 유효하지 않은 파일 이름(예: UTF-8 로케일에서 작업할 때 GBK 문자열)은 제대로 표시되지 않습니다(전혀 있는 경우).

3. 파일 시스템과 현재 환경 간의 문자 인코딩을 변환하기 위해 커널을 패치할 수 있습니까?

넌 패치할 수 없어핵심이를 수행하려면(1 참조), 이론적으로는 C 라이브러리(예: glibc)를 패치하여 이 변환을 수행하고 커널을 호출할 때 항상 파일 이름을 UTF-8로 변환한 다음 커널에서 다시 변환할 수 있습니다. 파일 이름을 읽을 때 인코딩.

더 간단한 접근 방식은 오버레이 파일 시스템을 작성하는 것일 수 있습니다.퓨즈, 파일 이름을 UTF-8로 변환한 후 파일 시스템 요청을 다른 위치로 리디렉션합니다. 이상적으로는 이 파일 시스템을 마운트할 수 ~/trans있으며 액세스할 때 ~/trans/a/GBK/encoded/pathFUSE 파일 시스템이 실제로 액세스됩니다 /a/UTF-8/encoded/path.

그러나 이러한 방법의 문제점은 파일 시스템에 이미 존재하지만 UTF-8로 인코딩되지 않은 파일을 어떻게 처리할 것인가입니다. 번역되지 않은 상태로 전달할 수는 없습니다. 그러면 변환 방법을 알 수 없기 때문입니다. 잘못된 문자 시퀀스를 변환하여 손상시킬 수는 없습니다. ?충돌이 발생할 수 있기 때문입니다.

답변2

당신이 할 수 있는 일은 지원되는 로케일의 수를 UTF-8 로케일로만 제한하는 것입니다.

http://www.fifi.org/cgi-bin/man2html/usr/share/man/man5/locale.gen.5

답변3

바닐라 unzip과 바닐라 p7zip 모두에서 OEM 코드 페이지 선택이 중단되었습니다. 내가 그랬어반점이 문제를 해결하고우분투용 ppa이 패치가 적용된 p7zip을 사용하십시오.

답변4

zip에 대한 이 문제는 다음과 같습니다.안정적인최근에는Far2l 파일 및 아카이브 관리자. Far2l의 이전 zip 문자 집합 감지가 제대로 작동하려면 시스템 언어 설정이 아카이브가 생성된 시스템에 설정된 언어 설정과 일치해야 합니다(Windows의 내부 "zip 폴더" 도구는 동일한 논리를 사용함). 너도 할 수 있어

LANG=zh_CN.UTF-8 far2l

관련 정보