ในขณะที่ทำงานกับเพื่อนร่วมงานฉันพบปัญหาแปลก ๆ ที่เกี่ยวข้องกับการเข้ารหัส เรากำลังทำงานกับภาพบางส่วนที่มีชื่อไฟล์ที่เรียบง่ายพอเช่นcity.gif
หรือwine.gif
แต่เป็นหนึ่งอาจคาดหวังสิ่งที่ได้รับความซับซ้อนมากขึ้นเมื่อใช้อักขระพิเศษเช่นé
, ,ë
à
เรากำลังทำงานกับข้อมูลดัตช์ที่มีตัวละครเหล่านี้เช่นcafé
( pub ) (เราไม่สามารถควบคุมที่มาของไฟล์ได้) ที่นี่มีปัญหาเกิดขึ้น ชื่อไฟล์ต่อไปนี้เป็นเพียงตัวอย่าง ปัญหานี้ยังเกิดขึ้นสำหรับตัวละครอื่น ๆ ที่มีกำกับ
café-2.png
cafetaria.png
café.png
รายการแรกและครั้งสุดท้ายควรมีสำเนียงอีในการมี (สำเนียง aigu, é
) นั่นเป็นวิธีการที่จะแสดงในลินุกซ์ (CentOS 6 & 7) ls
ในขั้วเมื่อทำงาน แต่ Windows มาที่นี่! (ใช้ Windows 10, 64 บิต) เมื่อเชื่อมต่อบน Windows ผ่าน SSL กับเซิร์ฟเวอร์ของเราแล้วโทรls
ออกรายการด้านบนจะมีลักษณะดังนี้:
café-2.png
cafetaria.png
caf▒.png
ในขณะที่คุณหวังว่าจะเห็นบรรทัดแรกยังคงมีสำเนียงอี é
แต่หนึ่งในสามไม่ได้ แต่ฉันเห็น▒
ตัวละครนี้ - ซึ่งอยู่medium shade
ใน Unicode (9618 ทศนิยม) นี่มันแปลกในตัวมันเอง อย่างไรก็ตามเมื่อฉันเชื่อมต่อผ่าน SFTP ด้วย Filezilla (ยังคงอยู่บน Windows) ฉันจะได้เห็นสิ่งนี้:
café-2.png
cafetaria.png
café.png
ดังนั้นตอนนี้สิ่งต่าง ๆ หันกลับมา: ในอันแรกé
เปลี่ยนไปเป็นลำดับและในอันที่สามทุกอย่างก็ดี ฉันพบที่นี่ว่าสิ่งนี้น่าจะเกิดจากการแปลง Latin-1 <-> UTF-8 ที่ผิดไปหากฉันทำให้ถูกต้อง แต่นั่นไม่ใช่สิ่งที่เกิดขึ้นใช่ไหม
Linux แสดงทุกอย่างตามที่เราคาดหวัง Windows แสดงพฤติกรรมที่ไม่สอดคล้องกันขึ้นอยู่กับวิธีที่เราดูชื่อไฟล์ (SSH (putty) หรือ SFTP (filezilla)) มีวิธีการ 'ทำให้ปกติ' ชื่อไฟล์เหล่านี้ - เช่นแก้ไข - และตรวจสอบให้แน่ใจว่าพวกเขาเหมือนกันในทุกระบบปฏิบัติการ หรืออย่างน้อยก็สอดคล้องกันและถ้าเป็นเช่นนั้นได้อย่างไร UTF-8
เป็นการเข้ารหัสที่เราเลือก
ถึงแม้ว่าสิ่งนี้อาจเหมือนกัน แต่เป็นปัญหาด้านสุนทรียภาพ แต่ก็ไม่ใช่ เมื่อพยายามดาวน์โหลดสิ่งต่าง ๆ ผ่าน SFTP ใน Windows จากเซิร์ฟเวอร์ Linux ของเราฉันไม่สามารถดาวน์โหลดไฟล์ที่มีปัญหาดังกล่าวข้างต้น Filezilla Can't download file café-2.png: café-2.png does not exist on the server
จะโยนความผิดพลาดเช่น ซึ่งดูเหมือนว่าฉัน Filezilla อ่านไดเรกทอรีและชื่อไฟล์แปลมันในการเข้ารหัสบางอย่างส่งคำขอ GET ไปยังเซิร์ฟเวอร์ด้วยการตีความ แต่การตีความนั้นแตกต่างจากชื่อไฟล์ Linux ดังนั้นจึงไม่พบไฟล์
ท้ายที่สุดก็คงจะดีถ้ามีวิธีแก้ปัญหาให้แม้ว่าฉันจะสนใจว่าทำไมสิ่งนี้ถึงเกิดขึ้น มันเกิดขึ้นเพราะไฟล์อิมเมจนั้นถูกสร้างขึ้นบนระบบปฏิบัติการที่แตกต่างกันหรือไม่? มันเกิดขึ้นเพราะเซิร์ฟเวอร์ Linux ตีความผิดหรือ Windows สับสน หวังว่าจะมีวิธีแก้ปัญหาที่เราสามารถติดต่อดูแลระบบของเราและขอให้พวกเขาเปิดสวิตช์ในการกำหนดค่าเซิร์ฟเวอร์ แต่ฉันกลัวว่ามันไม่ง่ายอย่างนั้น
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
และpython -c "import sys; print(repr(sys.argv[1]))" café.png
?