ฉันจะแตกไฟล์ ZIP ที่มีชื่อภาษาฮิบรูอย่างถูกต้องได้อย่างไร?


18

มีคนส่งไฟล์ ZIP ที่มีไฟล์ที่มีชื่อภาษาฮิบรูมาให้ฉัน (และสร้างขึ้นใน Windows ไม่แน่ใจว่าใช้เครื่องมือใด) ฉันใช้ LXDE กับ Debian Stretch เครื่องมือจัดการเก็บถาวรของ Gnome จัดการเพื่อคลายซิปไฟล์ แต่ตัวอักษรฮีบรูนั้นอ่านไม่ออก ฉันคิดว่าฉันได้รับ UTF-8 octets ที่ขยายออกเป็นอักขระ Unicode เช่นฉันมีไฟล์ที่ชื่อมีสี่ตัวอักษรและ. doc พอเพียงและตัวละครคือ: 0x008E 0x0087 0x00887 0x0085 การใช้ยูทิลิตี unzip สำหรับบรรทัดคำสั่งนั้นยิ่งแย่กว่านั้น - มันปฏิเสธที่จะแตกไฟล์ออกมาโดยสิ้นเชิงโดยบ่นว่าเป็น "multibyte หรืออักขระตัวกว้างไม่ถูกต้องหรือไม่สมบูรณ์"

ดังนั้นคำถามของฉันคือ:

  • มียูทิลิตี้การแตกไฟล์อื่นที่จะแตกไฟล์ของฉันด้วยชื่อที่ถูกต้องหรือไม่?
  • มีบางอย่างผิดปกติกับวิธีการบีบอัดไฟล์หรือเป็นเพียงความไม่เข้ากันของการใช้งาน ZIP หรือไม่ หรือแม้แต่ misfeature / bug ของยูทิลิตี้ ZIP ของ Linux?
  • ฉันจะทำอย่างไรเพื่อให้ได้ชื่อไฟล์ที่ถูกต้องหลังจากคลายการบีบอัดโดยใช้ไฟล์ที่อ่านไม่ออก

หากคุณค้นหาไบต์เหล่านั้นในตาราง cp862ชื่อไฟล์ตรงกับสิ่งที่คุณคาดหวัง มิฉะนั้นคุณรู้หรือไม่ว่าการเข้ารหัสเนทีฟของเครื่องต้นทาง?
Michael Homer

เหมือนกันสำหรับcp1255และการเข้ารหัสที่เป็นไปได้อื่น ๆ มันอาจเป็นไปได้ที่จะทำมันออกมาโดยดูจากสิ่งที่ถูกต้อง
Michael Homer

@MichaelHomer: ไม่มันดูไม่เหมือนเลย การเข้ารหัสดั้งเดิมของเครื่องต้นทางคือสิ่งที่ MS Windows ใช้เมื่อคุณตั้งค่าภูมิภาคเป็นฮิบรู - อิสราเอลดังนั้นฉันเดาว่าบางครั้งก็เป็น UTF-8 และ CP1255 ในบางครั้ง
einpoklum

คำตอบ:


15

ดูเหมือนว่าชื่อไฟล์จะถูกเข้ารหัสในหนึ่งใน codepages ที่เป็นกรรมสิทธิ์ของ Windows ( CP862 , 1255 , ฯลฯ )

  • มียูทิลิตี้การแตกไฟล์อื่นที่จะแตกไฟล์ของฉันด้วยชื่อที่ถูกต้องหรือไม่? ฉันไม่ทราบถึงประโยชน์ของ zip ที่สนับสนุนโค้ดเพจเหล่านี้ 7z มีความเข้าใจเกี่ยวกับการเข้ารหัส แต่ฉันเชื่อว่ามันต้องเป็นการเข้ารหัสระบบของคุณรู้มากขึ้นโดยทั่วไป (คุณเลือกได้โดยการตั้งค่าLANGตัวแปรสภาพแวดล้อม) และโค้ดเพจของ Windows อาจไม่อยู่ในนั้น

    unzip -UUควรทำงานจากบรรทัดคำสั่งเพื่อสร้างไฟล์ที่มีไบต์ที่ถูกต้องในชื่อของพวกเขา (โดยปิดการใช้งานการสนับสนุน Unicode ทั้งหมด) นั่นอาจเป็นผลกระทบที่คุณได้รับจากเครื่องมือของ GNOME แล้ว การเข้ารหัสจะไม่ถูกต้องทั้งสองวิธี แต่เราสามารถแก้ไขด้านล่างได้

  • มีบางอย่างผิดปกติกับวิธีการบีบอัดไฟล์หรือเป็นเพียงความไม่เข้ากันของการใช้งาน ZIP หรือไม่ หรือแม้แต่ความผิดพลาด / ข้อผิดพลาดของโปรแกรมอรรถประโยชน์ Linux ZIP? ไฟล์ที่คุณได้รับไม่ได้สร้างขึ้นแบบพกพา นั่นไม่จำเป็นต้องผิดสำหรับการใช้งานภายในที่การเข้ารหัสได้รับการแก้ไขและทราบล่วงหน้าแม้ว่าข้อกำหนดคุณสมบัติของรูปแบบระบุว่าชื่อควรจะเป็น UTF-8 หรือ cp437 และคุณก็ไม่ใช่ทั้งคู่ แม้ระหว่างเครื่อง Windows การใช้ codepages ต่าง ๆ ก็ใช้งานไม่ได้ แต่เครื่องที่ไม่ใช่ Windows ก็ไม่มีแนวคิดของหน้ารหัสเหล่านั้นที่จะเริ่มต้นด้วย เครื่องมือส่วนใหญ่เข้ารหัส UTF-8 ชื่อไฟล์ (ซึ่งยังไม่เพียงพอที่จะหลีกเลี่ยงปัญหา)

  • ฉันจะทำอย่างไรเพื่อให้ได้ชื่อไฟล์ที่ถูกต้องหลังจากคลายการบีบอัดโดยใช้ไฟล์ที่อ่านไม่ออก หากคุณสามารถระบุการเข้ารหัสของชื่อไฟล์คุณสามารถแปลงไบต์ในชื่อที่มีอยู่เป็น UTF-8 และย้ายไฟล์ที่มีอยู่ไปยังชื่อที่ถูกต้อง เครื่องมือหลัก wraps ขึ้นกระบวนการที่เป็นคำสั่งเดียว: จะพยายามที่จะแปลงภายในทุกอย่างจาก cp862 ให้เป็น UTF-8convmvconvmv -f cp862 -t utf8 -r ..

    หรือคุณสามารถใช้iconvและfindย้ายทุกอย่างไปยังชื่อที่ถูกต้อง สิ่งที่ต้องการ:

    find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp862 -t utf8)"' sh {} \;
    

    จะค้นหาไฟล์ทั้งหมดที่อยู่ภายใต้ไดเรกทอรีปัจจุบันและพยายามแปลงชื่อเป็น UTF-8

    ไม่ว่าในกรณีใดคุณสามารถทดลองใช้การเข้ารหัสที่แตกต่างกันและลองค้นหาวิธีที่เหมาะสม


หลังจากที่คุณได้แก้ไขการเข้ารหัสให้คุณแล้วหากคุณต้องการส่งไฟล์เหล่านี้กลับไปในทิศทางอื่นก็เป็นไปได้ว่าคุณจะมีปัญหาเดียวกันอีกด้านหนึ่ง ในกรณีนี้คุณสามารถย้อนกลับกระบวนการก่อนที่จะซิปไฟล์ด้วย-UUเนื่องจากเป็นไปได้ยากที่จะแก้ไขในส่วนท้ายของ Windows


ฉันเดาว่าสิ่งนี้จะต้องทำตั้งแต่ไฟล์ ZIP ที่ฉันดูอยู่ตอนนี้หายไปแล้วเหตุผลที่ไม่เกี่ยวข้องที่นี่ ขอบคุณจะทำในครั้งต่อไปและหวังว่าจะดีที่สุด
einpoklum

1
rarหรือp7zipปฏิเสธที่จะจัดการกับไฟล์. zip มีวิธีการแตกไฟล์เก็บถาวรด้วยชื่อไฟล์ในการเข้ารหัสที่เป็นกรรมสิทธิ์, บน Linux หรือไม่? เมื่อฉันแยกข้อมูลด้วยunzipฉันได้รับข้อผิดพลาด: "ข้อผิดพลาด: ไม่สามารถสร้าง╨и╨╕╨┐ / Ship_╨п╨Я╤А╨╛╤З╨╗╨░╨Я╤А╨╛╨н╤В╨╛╨ ▓╨Ю╨┤╨╜╨╛╨╣╨Ъ╨╜╨╕╨╢╨║╨╡! .png ชื่อไฟล์ยาวเกินไป "
Nickolai Leschov

ฉันจัดการเพื่อแยกไฟล์. zip อย่างถูกต้องด้วยLANG=ru_RU.CP1251; unzip Bleed.zip(มันคือการเข้ารหัส Cyrillic ในกรณีของฉัน) ตอนนี้ฉันสงสัยว่าฉันจะตั้งค่าระบบของฉันอย่างไรเพื่อให้ฉันสามารถเปิดไฟล์. zip ใน GUI ได้อย่างถูกต้อง
Nickolai Leschov

@NickolaiLeschov ถามคำถามและบางคนอาจช่วยคุณได้ คุณอาจต้องให้ข้อมูลเพิ่มเติมเกี่ยวกับระบบของคุณ
Michael Homer

unzip -UU foo.zipทำงานให้กับตัวละครตุรกี
Mert S. Kaplan

8

7z x <source.zip>ผมประสบความสำเร็จกับคำสั่ง

เวอร์ชัน:

p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,[...])

สภาพแวดล้อมที่เกี่ยวข้องที่อาจเกิดขึ้น:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_CTYPE=UTF-8

มันสามารถแตกไฟล์ทั้งหมดที่มีอักขระ 8 บิตในชื่อไฟล์โดยที่อักขระเหล่านี้บางส่วนถูกข้าม


p7zip เป็นคนเดียวที่ทำงานให้ฉัน
alex88

6

ฉันเพิ่งมีปัญหาเดียวกันและปรากฎว่ารุ่นของฉันunzipที่มีอยู่จากที่เก็บ Ubuntu ( UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.) สามารถจัดการการถอดรหัสชื่อไฟล์โดยอัตโนมัติหากคุณระบุ-aสวิตช์

unzip -a stupid.zip

+1 แม้ว่าฉันจะไม่ได้ทดสอบสิ่งนี้ในตอนนี้
einpoklum

1
ตามหน้าคนของสวิทช์ดูแลของการแปลงไฟล์ข้อความ ไม่ใช่ชื่อไฟล์ unzip-a
beruic

@beruic ฉันมีหมายเลข unicode ที่คลายซิปเป็นชื่อไฟล์ (# U + 0040 # U + 0050 ... ) จากนั้น "unzip -a" ช่วยได้จริงๆ
ช้าง

1
ฉันลองมันในการ์ตูนบางเรื่อง ชื่อไฟล์ถูกถอดรหัสอย่างถูกต้อง แต่ภาพก็ถูกตีความว่าเป็นข้อความ (!) และเกิดความเสียหายอย่างสมบูรณ์ มันยังตีความไฟล์ zip และ rar ภายในคลังข้อมูลเป็นข้อความการตรวจจับไร้ประโยชน์อย่างสมบูรณ์
rjh

2

ฉันมีปัญหาคล้ายกันกับการถอดรหัสไฟล์ zip ด้วยอักขระซิริลลิก สคริปต์ python หนึ่งบรรทัดทำงานอย่างถูกต้อง:

#!/usr/bin/python

import zipfile
import sys

zipfile.ZipFile(sys.argv[1], 'r').extractall(sys.argv[2] if len(sys.argv) > 2 else '.')

จากนั้นเพียงแค่เรียกมันunzip_encและเรียกมันว่าunzip_enc ZIP_FILE [TARGET_DIR]

สำหรับผมไม่unzip -UU, unzip -aหรือLANG*ตัวแปรสภาพแวดล้อมที่ไม่ดีใด ๆ


ฉันจะลองครั้งต่อไปที่ฉันมีไฟล์ zip เช่นนี้เพื่อแยก ... ขอบคุณ แต่ - คุณสามารถเปลี่ยนสคริปต์ของคุณเพื่อ: 1. ตรวจสอบว่ามีสองข้อโต้แย้ง 2. แยกไปยังไดเรกทอรีการทำงานปัจจุบันหากไฟล์ซิปเท่านั้นที่มีให้?
einpoklum

2

ฉันโชคดีกับชุดค่าผสมนี้:

export LANG=es_MX 
7z x file.zip
convmv -f cp437 -t utf8 -r .

เพิ่ม - ไม่รู้จัก convmv สำหรับการเปลี่ยนชื่อจริง หลังจากนั้นฉันพบรุ่นที่ดียิ่งขึ้น:

LANG=es_MX.cp437 unzip -UU file.zip
convmv -f cp437 -t utf8 -r . --notest

+1 สำหรับ convmv และเครื่องมือ 7zip บรรทัดคำสั่ง
einpoklum

อาจต้องลองตัวเลือกที่แตกต่างกันสำหรับLANGตัวแปรและจากการเข้ารหัสขึ้นอยู่กับไฟล์ที่อยู่ในมือ ฉันมีไฟล์ที่ทำงานLANG=ru_RU.CP1251ด้วยกัน -f cp866
Dmitri Chubarov

0

ฉันมีไฟล์บีบอัด zip ที่บีบอัดใน Linux (จากบรรทัดคำสั่ง) และชื่อไฟล์ที่มีอักขระกำกับไม่ถูกแตกอย่างถูกต้องบน Windows แต่ฉันคลายแพ็กมันด้วยซอฟต์แวร์Bandizipซึ่งสามารถตั้งค่าชุดอักขระบนแถบเครื่องมือ

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