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
中文
中文
질문:
- 고정 문자 인코딩(예:NTFSUTF-16은 LANG/LC_ALL 환경에 관계없이 파일 이름을 저장하기 위해 내부적으로 사용됩니까?
- 아니면 제가 정말 묻고 싶은 것은
$'\xe4\xb8\xad\xe6\x96\x87.txt'
파일 이름이 zh_CN.UTF-8 환경에서는 Chinese.txt()이고$'\xd6\xd0\xce\xc4.txt'
zh_CN.GBK 환경에서는 Chinese.txt()가 될 수 있습니까?동일한 파일 참조? - 구성할 수 없는 경우 커널을 패치하여 파일 시스템과 현재 환경 간의 문자 인코딩을 변환할 수 있습니까(구현 요청이 아닌 질문일 뿐입니다)? 가능하다면 성능에 어떤 영향을 미치나요?
답변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/path
FUSE 파일 시스템이 실제로 액세스됩니다
/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
답변4
zip에 대한 이 문제는 다음과 같습니다.안정적인최근에는Far2l 파일 및 아카이브 관리자. Far2l의 이전 zip 문자 집합 감지가 제대로 작동하려면 시스템 언어 설정이 아카이브가 생성된 시스템에 설정된 언어 설정과 일치해야 합니다(Windows의 내부 "zip 폴더" 도구는 동일한 논리를 사용함). 너도 할 수 있어
LANG=zh_CN.UTF-8 far2l