Trong khi làm việc với một đồng nghiệp, tôi đã tìm thấy một vấn đề kỳ lạ có vẻ liên quan đến tiền mã hóa. Chúng tôi đang làm việc với một số hình ảnh mà có đủ tên tập tin đơn giản như city.gif
hoặc wine.gif
, nhưng như người ta có thể mong đợi nhận được những điều phức tạp hơn khi sử dụng ký tự đặc biệt như é
, ë
, à
. Chúng tôi cũng đang làm việc với dữ liệu Hà Lan có các ký tự này, ví dụ: café
( quán rượu ). (Chúng tôi không có quyền kiểm soát nguồn gốc của các tệp.) Đây là nơi các vấn đề bắt đầu phát sinh. Các tên tập tin sau đây chỉ là một ví dụ. Vấn đề cũng xảy ra đối với các nhân vật khác có dấu phụ.
café-2.png
cafetaria.png
café.png
Mục đầu tiên và cuối cùng nên có một dấu e ở đó (dấu aigu, é
). Đó là cách nó được hiển thị trong Linux (CentOS 6 & 7) trong một thiết bị đầu cuối khi chạy ls
. Nhưng đây là Windows! (Sử dụng Windows 10, 64 bit.) Khi được kết nối trên Windows thông qua SSL với máy chủ của chúng tôi và sau đó gọi ls
, danh sách trên trông như thế này:
café-2.png
cafetaria.png
caf▒.png
Như bạn có thể hy vọng, dòng đầu tiên vẫn có dấu e é
, nhưng dòng thứ ba thì không. Thay vào đó, tôi thấy ▒
ký tự này - medium shade
ở dạng unicode (9618 thập phân). Điều này là lạ trong chính nó. Tuy nhiên, khi tôi kết nối qua SFTP với Filezilla (vẫn trên Windows), tôi nhận thấy điều này:
café-2.png
cafetaria.png
café.png
Vì vậy, bây giờ mọi thứ đã quay lại: trong phần đầu tiên, é
đã thay đổi thành trình tự và trong phần thứ ba, mọi thứ đều ổn. Tôi thấy ở đây rằng điều này rất có thể là do chuyển đổi Latin-1 <-> UTF-8 đã sai, nếu tôi hiểu đúng. Nhưng đó không phải là tất cả những gì đang diễn ra, phải không?
Linux hiển thị mọi thứ như chúng ta mong đợi, Windows hiển thị hành vi dường như không nhất quán tùy thuộc vào cách chúng ta xem tên tệp (SSH (putty) hoặc SFTP (filezilla)). Có cách nào để 'bình thường hóa' các tên tệp này - tức là chỉnh sửa chúng - và đảm bảo rằng tất cả chúng đều giống nhau trên mọi HĐH; hoặc ít nhất là nhất quán, và nếu vậy, làm thế nào? UTF-8
là mã hóa của sự lựa chọn của chúng tôi.
Mặc dù điều này có thể chỉ đơn thuần là một vấn đề thẩm mỹ, nhưng nó không phải là. Khi cố tải xuống mọi thứ thông qua SFTP trong Windows từ máy chủ Linux của chúng tôi, tôi không thể tải xuống các tệp có vấn đề được đề cập ở trên. Filezilla sẽ đưa ra một lỗi như Can't download file café-2.png: café-2.png does not exist on the server
. Dường như với tôi rằng Filezilla đọc thư mục và tên tệp, diễn giải nó trong một số mã hóa, gửi yêu cầu GET đến máy chủ với cách giải thích của nó, nhưng cách giải thích đó khác với tên tệp Linux do đó không tìm thấy tệp.
Cuối cùng, thật tuyệt nếu có một giải pháp khả dụng, mặc dù tôi cũng quan tâm đến lý do tại sao điều này xảy ra. Có xảy ra do các tệp hình ảnh có thể được tạo trên các Hệ điều hành khác nhau không? Có xảy ra do máy chủ Linux giải thích chúng sai hay Windows bị rối không? Hy vọng có một giải pháp mà chúng ta có thể chỉ cần liên hệ với sysadmin của mình và yêu cầu họ bật công tắc trong cấu hình máy chủ, nhưng tôi sợ nó không dễ như vậy.
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
và python -c "import sys; print(repr(sys.argv[1]))" café.png
?