Một số câu hỏi về mã hóa ký tự hệ thống tệp trên linux


12

Do có rất nhiều hoạt động trao đổi tệp giữa Windows ( mã hóa GBK ) và Linux ( mã hóa UTF-8 ), nó sẽ gặp phải các vấn đề mã hóa ký tự một cách dễ dàng, chẳng hạn như:

  • các tệp zip / tar có tên chứa các ký tự tiếng Trung trên hệ thống Windows, giải nén / giải nén nó trong hệ thống Linux.
  • chạy ứng dụng web java di sản (được thiết kế trên hệ thống Windows, sử dụng mã hóa GBK trong JSP) để ghi các tệp có tên mã hóa GBK vào đĩa.
  • ftp get / đặt các tệp có tên mã hóa GBK giữa máy chủ Windows FTP và máy khách Linux.
  • chuyển đổi môi trường LANG trong Linux.

Vấn đề phổ biến của các đề cập trước đó là định vị / đặt tên tệp. Sau khi googled, tôi nhận được một bài viết sử dụng Unicode trong Linux http://www.linux.com/archive/feed/39912 , nó nói:

hệ điều hành và nhiều tiện ích không nhận ra các ký tự mà byte trong tên tệp đại diện.

Vì vậy, có thể có các tệp .txt 2xt với mã hóa khác nhau:

[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
中文
中文

Câu hỏi:

  1. Có thể cấu hình hệ thống tập tin linux sử dụng mã hóa ký tự cố định (như NTFS sử dụng UTF-16 trong nội bộ) để lưu trữ tên tệp bất kể môi trường LANG / LC_ALL không?
  2. Hoặc, những gì tôi thực sự muốn đặt ra là: Liệu có thể để cho tên file .txt中文( $'\xe4\xb8\xad\xe6\x96\x87.txt') trong zh_CN.UTF-8 môi trường và tên file .txt中文( $'\xd6\xd0\xce\xc4.txt') trong môi trường zh_CN.GBK tham khảo cùng một tập tin ?
  3. Nếu nó không thể cấu hình, thì có thể vá kernel để dịch mã hóa ký tự giữa hệ thống tệp và môi trường hiện tại (chỉ là một câu hỏi, không yêu cầu thực hiện)? và hiệu suất con hiệu quả bao nhiêu nếu có thể?

Bạn có thể giải quyết vấn đề từ phía Windows bằng cách sử dụng Cygwin 1.7, tự động dịch giữa mã hóa UTF-16 của hệ thống tệp và bất kỳ mã hóa nào đã được chỉ định trong cài đặt ngôn ngữ. Nó mặc định là UTF-8, vì vậy, ví dụ Cygwin tar sẽ mã hóa tên tệp là UTF-8.
ak2

@ ak2 Cảm ơn, Cygwin thực sự tốt, tôi đã sử dụng nó trong nhiều năm. Trường hợp tar / zip chỉ là một ví dụ, trong môi trường thực, các tệp zip / tar có thể được tạo bởi người khác (chẳng hạn như tải xuống một tệp từ internet).
LiuYan 刘

Câu trả lời:


8

Tôi đã điều chỉnh lại câu hỏi của bạn một chút, vì những lý do sẽ xuất hiện rõ ràng khi bạn đọc chúng theo trình tự.

1. Có thể cấu hình hệ thống tập tin linux sử dụng mã hóa ký tự cố định để lưu trữ tên tệp bất kể môi trường LANG / LC_ALL không?

Không, điều này là không thể: như bạn đã đề cập trong câu hỏi của mình, tên tệp UNIX chỉ là một chuỗi các byte; hạt nhân không biết gì về mã hóa, hoàn toàn là một khái niệm không gian người dùng (tức là cấp độ ứng dụng).

Nói cách khác, kernel không biết gì về LANG / LC_*, vì vậy nó không thể dịch.

2. Có thể để các tên tệp khác nhau tham chiếu đến cùng một tệp không?

Bạn có thể có nhiều mục thư mục tham chiếu đến cùng một tệp; bạn có thể thực hiện điều đó thông qua các liên kết cứng hoặc liên kết tượng trưng .

Tuy nhiên, hãy lưu ý rằng tên tệp không hợp lệ trong mã hóa hiện tại (ví dụ: chuỗi ký tự GBK của bạn khi bạn đang làm việc trong miền địa phương UTF-8) sẽ hiển thị rất tệ.

3. Có thể vá kernel để dịch mã hóa ký tự giữa hệ thống tệp và môi trường hiện tại không?

Bạn không thể vá kernel để làm điều này (xem 1.), nhưng bạn có thể - trong lý thuyết - vá thư viện C (ví dụ: glibc) để thực hiện bản dịch này và luôn chuyển đổi tên tệp thành UTF-8 khi nó gọi kernel, và chuyển đổi chúng trở lại mã hóa hiện tại khi nó đọc tên tệp từ kernel.

Một cách tiếp cận đơn giản hơn có thể là viết một hệ thống tệp lớp phủ bằng FUSE , chỉ cần chuyển hướng bất kỳ yêu cầu hệ thống tệp nào đến một vị trí khác sau khi chuyển đổi tên tệp thành / từ UTF-8. Lý tưởng nhất là bạn có thể gắn hệ thống tệp này vào ~/transvà khi quyền truy cập được thực hiện ~/trans/a/GBK/encoded/paththì hệ thống tệp FUSE thực sự truy cập /a/UTF-8/encoded/path .

Tuy nhiên, vấn đề với các phương pháp này là: bạn sẽ làm gì với các tệp đã tồn tại trên hệ thống tệp của mình và không được mã hóa UTF-8? Bạn không thể đơn giản chuyển chúng chưa được dịch, bởi vì sau đó bạn không biết cách chuyển đổi chúng; bạn không thể thu thập chúng bằng cách dịch các chuỗi ký tự không hợp lệ sang ?vì điều đó có thể tạo ra xung đột ...


4
Một hệ thống tập tin lớp phủ như vậy tồn tại: Convmvfs .
Gilles 'SO- ngừng trở nên xấu xa'

1

Những gì bạn có thể làm là giới hạn số lượng địa phương được hỗ trợ chỉ ở các địa điểm UTF-8.

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


2
Cá nhân, tôi ước chỉ có 1 bộ mã hóa ký tự (UTF-8) trên thế giới, nhưng vẫn có ứng dụng kế thừa vẫn đang chạy và phải đạt được khả năng tương tác giữa Windows và Linux, hầu hết mọi người phải đối mặt với cơn ác mộng này.
LiuYan 刘
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.