Mã hóa bảng mã nào được sử dụng cho tên tệp và đường dẫn trên Linux?


45

Có phụ thuộc vào hệ thống tập tin tôi sử dụng? Ví dụ, ext2 / ext3 / ext4 nhưng điều gì xảy ra khi tôi chèn một trong những CD-ROM "joliet" đó với ISO 9660? Tôi đã nghe nói rằng POSIX có chứa một số loại thông số kỹ thuật cho bảng mã tên tập tin?

Về cơ bản, điều tôi băn khoăn là nếu tôi có một tên tệp được mã hóa UTF-8, tôi cần xử lý / bao phủ gì trước khi chuyển nó sang API I / O tệp trong Linux?


Các câu trả lời dưới đây nói rằng hệ điều hành và hệ thống tập tin không quan tâm đến mã hóa. Một số hệ thống tập tin, chẳng hạn như HFS +, rất quan tâm. HFS +, tôi tin rằng, yêu cầu UTF-8, nó chuyển đổi bên trong thành một phương ngữ hạn chế của UTF-16. NTFS cũng có một vấn đề tương tự nhưng tôi không rõ về chi tiết.
zmccord

HFS + cũng yêu cầu các tên được phân tách không hoạt động tốt với xu hướng sử dụng tiền mã hóa của linux. web.archive.org/web/20080518105836/http://developer.apple.com/...
user12439

Câu trả lời:


49

Như những người khác lưu ý, thực sự không có câu trả lời cho điều này: tên tệp và đường dẫn không có mã hóa; HĐH chỉ xử lý chuỗi byte. Các ứng dụng riêng lẻ có thể chọn giải thích chúng là được mã hóa theo một cách nào đó, nhưng điều này khác nhau.

Cụ thể, Glib (được sử dụng bởi các ứng dụng Gtk +) giả định rằng tất cả các tên tệp được mã hóa UTF-8, bất kể ngôn ngữ của người dùng . Điều này có thể được ghi đè bằng các biến môi trường G_FILENAME_ENCODINGG_BROKEN_FILENAMES .

Mặt khác, Qt mặc định cho rằng tất cả các tên tệp được mã hóa theo ngôn ngữ của người dùng hiện tại . Một ứng dụng riêng lẻ có thể chọn ghi đè giả định này, mặc dù tôi không biết điều gì xảy ra và không có công tắc ghi đè bên ngoài.

Các bản phân phối Linux hiện đại được thiết lập sao cho tất cả người dùng đang sử dụng các vị trí UTF-8 và các đường dẫn trên các hệ thống tập tin nước ngoài được dịch sang UTF-8, do đó, sự khác biệt này trong chiến lược thường không có hiệu lực. Tuy nhiên, nếu bạn thực sự muốn an toàn, bạn không thể giả sử bất kỳ cấu trúc nào về tên tệp ngoài "NUL chấm dứt, '/' - chuỗi byte được phân tách".

(Cũng lưu ý: ngôn ngữ có thể thay đổi theo quy trình. Hai quy trình khác nhau được chạy bởi cùng một người dùng có thể ở các địa điểm khác nhau chỉ bằng cách đặt các biến môi trường khác nhau.)


1
"Chấm dứt NUL, '/' - chuỗi byte được phân tách" Nhưng không có mã hóa, làm sao bạn biết byte nào đại diện cho '/'?
Jack

1
@Jack Luôn '\x2F'bất kể mọi thứ trông như thế nào /. Đáng chú ý khác nhau trong SJIS.
ephemient

1
À được rồi. Bạn sẽ xem xét cập nhật câu trả lời với thông tin đó? Có lẽ chỉ vì gần đây tôi đã làm việc trên một thư viện chuyển đổi bộ ký tự, nhưng cụm từ "'/' - chuỗi byte được phân tách" không có nghĩa gì với tôi.
Jack

Vậy làm thế nào để xem byte tên tệp trong phiên SSH trong HEX?
Ngày

11

Lớp unix / posix của linux không quan tâm bạn sử dụng mã hóa nào. Nó lưu trữ chuỗi byte của mã hóa hiện tại của bạn.

Tôi nghĩ rằng các tùy chọn gắn kết đó là có để giúp bạn chuyển đổi các hệ thống tệp cụ thể xác định bộ ký tự sang bộ ký tự hệ thống của bạn. (Các biến thể CDROM, NTFS và FAT sử dụng một số biến thể unicode).

Tôi muốn unix xác định một mã hóa toàn cầu hệ thống, nhưng nó thực sự là một thiết lập cho mỗi người dùng. Vì vậy, nếu bạn xác định một mã hóa khác thì đồng nghiệp của bạn, tên tệp của bạn sẽ hiển thị khác nhau.


Vì vậy, sau đó tôi có lẽ nên kiểm tra ngôn ngữ mà người dùng hiện đang sử dụng và chuyển đổi sang tệp đó cho các tệp mới để anh ta sẽ thấy tên tệp chính xác trong Nautilus, v.v. Làm thế nào tôi có thể biết bộ ký tự tên tệp hiện tại là gì cho người dùng hiện tại?
martin

1
@martin Điều đó thậm chí không đơn giản ... Các quy trình khác nhau có thể sử dụng các bảng mã khác nhau, tùy thuộc vào các biến env và ngôn ngữ được viết.
Basic

5

Nó phụ thuộc vào cách bạn gắn kết hệ thống tệp, chỉ cần xem các tùy chọn gắn kết cho các hệ thống tệp khác nhau trong man mount. Ví dụ iso9660, vfatfatiocharsetutf8các tùy chọn.


Vì vậy, nếu tôi gắn kết nó bằng cách sử dụng utf8, tôi cũng nên chuyển utf8 cho tòa nhà mở ()?
martin

Ngoài ra tôi cũng tìm thấy cái này ( library.gnome.org/devel/glib/unurdy/, ) dường như chỉ ra rằng mã hóa bộ ký tự của tên tệp phụ thuộc vào ngôn ngữ nào được đặt?
martin
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.