ฉันจะบอกได้อย่างไรว่าการเข้ารหัสชื่อไฟล์กำลังใช้งานอยู่?


1

ฉันมีบางไฟล์ที่มีชื่อภาษารัสเซีย (ซิริลลิก)

เมื่อฉันเปิดใน Windows Explorer ชื่อจะแสดงอย่างถูกต้อง

เมื่อฉันแสดงรายการไว้ใน Command shell (cmd) พวกเขาจะแสดงเป็น "?????" ตัวละคร

มีวิธีบอกการเข้ารหัสที่ใช้ในชื่อไฟล์หรือไม่?

หนึ่งในหน้ารหัส? (ฉันลองรหัสซิริลลิกทั่วไปหน้า 866 และ 1251 โดยใช้chcpคำสั่งโดยไม่มีโชค) Unicode (ฉันลอง 65001 ไม่มีโชค)? อื่น ๆ อีก?

ฉันไม่สนใจวิธีการของคำตอบเป็นพิเศษ (ทั้งหมดต่อไปนี้เป็นที่ยอมรับได้: โปรแกรมฟรีแวร์, สคริปต์ Perl, สคริปต์ Powershell, หน้าเว็บที่ทำให้ฉันอัปโหลดไฟล์)

ระบบ: Windows XP SP3


หมายเหตุด้านข้าง: หลังจากขุดต่อไปฉันรู้ว่าปัญหาของฉันเกิดจากไม่เพียง แต่หน้ารหัส แต่ความจริงที่ว่าฉันไม่ได้ใช้ฟอนต์ Lucida Console (แต่เป็นฟอนต์แรสเตอร์) เมื่อฉันเปลี่ยนแบบอักษรเป็น Lucida Console และ chcp เป็น Unicode (65001) ชื่อไฟล์จะแสดงอย่างถูกต้อง ดังนั้นมันจึงเป็น Unicode ... แต่คำถามดั้งเดิมของฉันยังคงอยู่ - ฉันจะบอกการเข้ารหัสได้อย่างไรโดยไม่คาดเดาหน้ารหัสที่ถูกต้อง
DVK

คำตอบ:


2

การเข้ารหัสชื่อไฟล์ถูกกำหนดโดยระบบไฟล์ NTFS ใช้ UTF-16 แม้ว่ามันจะไม่สำคัญ

เมื่อคุณdirอยู่ในบรรทัดคำสั่งมันไม่เพียง แต่คัดลอกไบต์สุ่มสี่สุ่มห้า ก่อนอื่นต้องเรียกใช้ฟังก์ชัน OS ที่เหมาะสมเพื่อแสดงรายการไดเรกทอรีจากนั้นพิมพ์รายละเอียดไฟล์ที่ได้รับไปยังคอนโซล

เมื่อcmdเรียกใช้ฟังก์ชั่นระบบเพื่อดึงข้อมูลรายชื่อไดเรกทอรีมันคาดว่ามันจะถูกส่งกลับในการเข้ารหัสที่ต้องการ (ซึ่งไม่จำเป็นต้องเข้ารหัสที่คุณเลือก - เพิ่มเติมในภายหลัง) ไม่สนใจว่าจะใช้การเข้ารหัสภายในแบบใดเนื่องจาก FS จะให้เลเยอร์นามธรรมเพิ่มเติมเพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้น FS สามารถใช้การเข้ารหัสที่คุณสามารถจินตนาการได้ แต่ตราบใดที่ OS รองรับมันcmdจะได้รับชื่อไฟล์ในการเข้ารหัสที่ต้องการไม่ใช่การเข้ารหัสของ FS

"การเข้ารหัสที่ต้องการ" ที่ฉันพูดถึงคือ ANSI ที่ใช้เพจรหัสหรือ Unicode ANSI ถูกใช้เป็นการเข้ารหัสเริ่มต้นก่อน Windows 2000 Windows 2000 และรุ่นที่ใหม่กว่าใช้ Unicode เป็นค่าเริ่มต้น แต่ยังคงสามารถเรียกใช้โปรแกรม ANSI ได้

สำหรับโปรแกรม Unicode โค้ดเพจจะถูกละเว้นอย่างสมบูรณ์และchcpไม่มีผลกระทบ มันใช้เฉพาะกับโปรแกรม ANSI รุ่นเก่าซึ่งขึ้นอยู่กับเพจรหัสที่ถูกตั้งค่า มันไม่สำคัญอีกต่อไปสำหรับ Unicode เพราะมันถูกกำหนดไว้อย่างดีและสนับสนุนทุกสิ่งที่โปรแกรมที่เหมาะสมสามารถแสดงผลได้

cmd รองรับ Unicode ดังนั้นจึงจะได้รับชื่อไฟล์เป็น Unicode อยู่แล้ว

ดังที่คุณทราบแล้วผู้กระทำผิดเป็นแบบอักษรเริ่มต้น ปัญหานี้ถูกกล่าวถึงในหน้า Technet บน chcp :

เฉพาะหน้ารหัสผู้ผลิตอุปกรณ์ดั้งเดิม (OEM) ที่ติดตั้งด้วย Windows XP ปรากฏขึ้นอย่างถูกต้องในหน้าต่างพรอมต์คำสั่งที่ใช้แบบอักษร Raster หน้ารหัสอื่น ๆ ปรากฏอย่างถูกต้องในโหมดเต็มหน้าจอหรือหน้าต่างพรอมต์คำสั่งที่ใช้แบบอักษร TrueType

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.