วิธีการเปลี่ยนการเข้ารหัสจากข้อความที่ไม่ใช่ ASCII-Extended Extended ASCII, ด้วยตัวต่อบรรทัด CRLF เป็น UTF-8


21

ฉันมีไฟล์ txt:

$ file -i x.txt
x.txt: text/plain; charset=unknown-8bit
$ file x.txt 
x.txt: Non-ISO extended-ASCII text, with CRLF line terminators

และมีอักขระบางตัวที่เข้ารหัสไม่ถูกต้อง:

trwa³y, sta³y, usuwaæ

ฉันจะเปลี่ยนการเข้ารหัสของไฟล์นี้เป็น UTF-8 ได้อย่างไร ฉันได้ลองวิธีต่อไปนี้แล้ว:

$ iconv -f ASCII -t UTF-8 x.txt
                puiconv: illegal input sequence at position 4

บางทีฉันควรใช้extended ASCII( high ASCII) แต่หาไม่พบในiconvรายการเข้ารหัสของ


2
คุณสามารถอัพโหลดไฟล์ได้ที่ไหน?
Janos

มีรายการที่มีประโยชน์ของ 8 บิตการเข้ารหัส ISO, ทั้งหมดที่แสดงด้านข้างเป็นที่นี่ ทำอย่างใดอย่างหนึ่งใกล้กับสิ่งที่คุณสังเกตเห็นในไฟล์ของคุณ ตัวอย่างเช่นหากคุณคิดว่า "sta³y" ควรเป็น "stacy" ให้ค้นหาการเข้ารหัสที่มี "c" สำหรับรหัสเลขฐานสิบแปลก ๆ ที่อยู่ในคำนั้น
John1024

อาจเป็น 90% ของเวลา "ข้อความ Non-ISO Extended-ASCII" จะเป็นไฟล์ที่เข้ารหัสในเพจรหัสของWindows 1252 "มันอาจเป็นการเข้ารหัสอักขระ 8 บิตที่ใช้มากที่สุดในโลก" (วิกิพีเดีย) ลองก่อน:iconv -f windows-1252 -t utf-8 file
nyov

คำตอบ:


33

file บอกให้คุณทราบว่า "ข้อความที่ไม่ใช่ ASCII แบบขยาย ISO" เพราะตรวจพบว่าเป็น:

  • เป็นไปได้ว่าไฟล์“ text” จากการขาดตัวควบคุม (ค่าไบต์ 0–31) นอกเหนือจากตัวแบ่งบรรทัด
  • “ Extended-ASCII” เนื่องจากมีอักขระอยู่นอกช่วง ASCII (ค่าไบต์≥128);
  • “ ไม่ใช่ ISO” เนื่องจากมีอักขระในช่วง 128–159 ( ISO 8859ขอสงวนช่วงนี้สำหรับอักขระควบคุม)

คุณต้องหาว่าการเข้ารหัสไฟล์นี้น่าจะเป็นอะไรคุณสามารถลองใช้การจดจำอัตโนมัติของEnca คุณอาจต้องสะกิดมันไปในทิศทางที่ถูกต้องโดยบอกให้เป็นภาษาของข้อความ

enca x.txt
enca -L polish x.txt

ในการแปลงไฟล์ให้ผ่าน-xตัวเลือก:enca -L polish x.txt -x utf8 >x.utf8.txt

หากคุณไม่สามารถหรือไม่ต้องการใช้ Enca คุณสามารถเดาการเข้ารหัสด้วยตนเอง บิตของการมองไปรอบ ๆ บอกผมว่านี่คือข้อความที่โปแลนด์และคำที่มีtrwały, stały, usuważดังนั้นเรากำลังมองหาสำหรับการแปลที่³łและ→æ żลักษณะเช่นนี้latin-2หรือละติน-10 (รับ“ไม่ ISO” หรือมีแนวโน้มที่CP1250ที่คุณรับชมที่กำลังเป็นlatin1 . ในการแปลงไฟล์เพื่อ UTF-8 คุณสามารถใช้Recodeหรือiconv

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt

ฉันไม่ได้รับเป็นส่วนหนึ่งกับ< x.txt > x.utf8.txtทำไมเราไม่ใช้<แล้ว>? มันทำงานยังไง?
Filip Bartuzi

@FilipBartuzi <และ>ดำเนินการinput และ output เปลี่ยนเส้นทางตามลำดับ
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

1

เปิดไฟล์ข้อความด้วย gedit และในกล่องโต้ตอบ "บันทึกเป็น .. " คุณจะเห็นการเข้ารหัสปัจจุบัน


0

คุณพยายามค้นหาการเข้ารหัสที่แน่นอนคือ x.txt หรือไม่ คุณจะได้รับรายการการเข้ารหัสที่สนับสนุนด้วย

iconv - รายการ

บางครั้งมันก็เกิดขึ้นกับฉันที่ฉันได้รับไม่ตรงกันระหว่าง latin1 และ utf8 จากนั้นก็มักจะช่วยในการแปลงจากและกลับไปเป็น utf8 และในทางกลับกัน


0

ฉันสร้างสคริปต์การแปลงอัตโนมัติโดยใช้ห้องสมุดencaฉันใช้มันใน NAS ของฉันเพื่อแปลงคำบรรยายเป็น UTF-8 แต่มันสามารถนำไปใช้กับการแปลงอัตโนมัติใด ๆ

รู้สึกอิสระที่จะใช้ :)

แก้ไข:

#!/bin/bash
LANGUAGE=czech
TO=utf8
CONVERT="enca -L $LANGUAGE -x $TO"

# Find and onvert
find ./ -type f -name "*.srt" | while read fn; do
  IS_TARGET=`enca "${fn}" | egrep -ow -m 1 'UTF-8|Unrecognized|KOI8-CS2|7bit ASCII|UCS-2|Macintosh Central European'`

    if [ "$IS_TARGET" != "UTF-8" ] &&
       [ "$IS_TARGET" != "UCS-2" ] &&
       [ "$IS_TARGET" != "Macintosh Central European" ] &&
       [ "$IS_TARGET" != "Unrecognized" ] &&
       [ "$IS_TARGET" != "7bit ASCII" ] &&
       [ "$IS_TARGET" != "KOI8-CS2" ]; then

        echo "${fn} ---- Will be converted!"
    # optional backup of original srt
        # cp "${fn}" "${fn}.bak"
        $CONVERT "${fn}"
    fi  

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