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


526

เครื่องมือหรือวิธีที่เร็วที่สุดและง่ายที่สุดในการแปลงไฟล์ข้อความระหว่างชุดอักขระคืออะไร

โดยเฉพาะฉันต้องแปลงจาก UTF-8 เป็น ISO-8859-15 และในทางกลับกัน

ทุกอย่างเป็นไปได้: หนึ่งใน liners ในภาษาสคริปต์ที่คุณชื่นชอบ, เครื่องมือบรรทัดคำสั่งหรือยูทิลิตี้อื่น ๆ สำหรับ OS, เว็บไซต์, ฯลฯ

ทางออกที่ดีที่สุด:

บน Linux / UNIX / OS X / cygwin:

  • Gnu iconvแนะนำโดยTroels อาร์วินดีที่สุดคือใช้เป็นตัวกรอง ดูเหมือนว่าจะมีอยู่ทั่วไป ตัวอย่าง:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    ในฐานะที่เป็นแหลมออกโดยเบนมีการแปลงออนไลน์โดยใช้ iconv

  • Gnu Recode ( คู่มือ ) แนะนำโดยCheekysoftจะแปลงหนึ่งหรือหลายไฟล์ในสถานที่ ตัวอย่าง:

    $ recode UTF8..ISO-8859-15 in.txt
    

    อันนี้ใช้นามแฝงที่สั้นกว่า:

    $ recode utf8..l9 in.txt
    

    Recode ยังรองรับพื้นผิวที่สามารถใช้ในการแปลงระหว่างประเภทการสิ้นสุดบรรทัดและการเข้ารหัสที่แตกต่างกัน:

    แปลงบรรทัดใหม่จาก LF (Unix) เป็น CR-LF (DOS):

    $ recode ../CR-LF in.txt
    

    Base64 ไฟล์เข้ารหัส:

    $ recode ../Base64 in.txt
    

    คุณสามารถรวมมันเข้าด้วยกัน

    แปลงไฟล์ UTF8 Base64 เข้ารหัสด้วยระบบปฏิบัติการยูนิกซ์ปลายสายที่จะเข้ารหัส Base64 ละติน 1 ไฟล์กับดอสตอนจบบรรทัด:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

บน Windows ด้วยPowershell ( Jay Bazuzi ):

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (ไม่ ISO-8859-15 สนับสนุนแม้ว่า;. มันบอกว่าชุดอักขระที่สนับสนุน Unicode, UTF7, utf8, utf32, ASCII, bigendianunicode เริ่มต้นและ OEM)

แก้ไข

คุณหมายถึง iso-8859-1 การใช้ "String" ทำสิ่งนี้เช่นในทางกลับกัน

gc -en string in.txt | Out-File -en utf8 out.txt

หมายเหตุ: ค่าการแจงนับที่เป็นไปได้คือ "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii"


ฉันพยายามgc -en Ascii readme.html | Out-File -en UTF8 readme.htmlแต่มันแปลงไฟล์เป็น utf-8 แต่แล้วมันว่างเปล่า! Notepad ++ บอกว่าไฟล์เป็นรูปแบบ Ansi แต่อ่านเพราะผมเข้าใจว่ามันไม่ใช่ charset ที่ใช้ได้ ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

2
เพิ่งเจอสิ่งนี้ที่กำลังมองหาคำตอบสำหรับคำถามที่เกี่ยวข้อง - สรุปที่ยอดเยี่ยม! แค่คิดว่ามันมีค่าเพิ่มที่recodeจะทำหน้าที่เป็นตัวกรองเช่นกันหากคุณไม่ผ่านชื่อไฟล์ใด ๆ เช่น:recode utf8..l9 < in.txt > out.txt
Jez

iconv.com/iconv.htmดูเหมือนจะตายสำหรับฉัน (หมดเวลา)
แอนดรู Newby

2
หากคุณใช้encaคุณไม่จำเป็นต้องระบุการเข้ารหัสอินพุต enca -L ru -x utf8 FILE.TXTมันมักจะพอเพียงที่จะระบุภาษา:
Alexander Pozdneev

1
อันที่จริง iconv ทำงานได้ดีขึ้นมากในฐานะตัวแปลงแบบแทนที่ตัวกรอง แปลงไฟล์ที่มีมากกว่า 2 ล้านเส้นโดยใช้iconv -f UTF-32 -t UTF-8 input.csv > output.csvบันทึกไว้เพียงประมาณเจ็ดร้อยพันสายเพียงหนึ่งในสาม การใช้เวอร์ชันในสถานที่iconv -f UTF-32 -t UTF-8 file.csvแปลงเรียบร้อยแล้วบวก 2 ล้านเส้นทั้งหมด
Nicolay77

คำตอบ:


246

วิธีการยูทิลิตี้แบบสแตนด์อโลน

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

คุณไม่ได้มีการระบุอย่างใดอย่างหนึ่งของการขัดแย้งเหล่านี้ พวกเขาจะเริ่มต้นที่สถานที่ปัจจุบันของคุณซึ่งมักจะเป็น UTF-8


4
สำหรับคนอื่น ๆ ที่ได้รับการสะดุดด้วยเวอร์ชันที่ไม่ใช่เส้นประซึ่งไม่สามารถใช้งานได้ดูเหมือนว่าไอคอนเวอร์ชัน OSX (และอาจเป็น BSD ทั้งหมด) ไม่สนับสนุนนามแฝงที่ไม่ใช่เส้นประสำหรับการเข้ารหัส UTF- * ที่หลากหลาย iconv -l | grep UTFจะบอกการเข้ารหัสที่เกี่ยวข้องกับ UTF ทั้งหมดให้คุณทราบว่าสำเนาของ iconv ของคุณรองรับ
coredumperror

14
ไม่ทราบว่าการเข้ารหัสไฟล์อินพุตของคุณหรือไม่ ใช้chardet in.txtเพื่อสร้างการคาดเดาที่ดีที่สุด ผลลัพธ์สามารถใช้เป็น ENCODING iconv -f ENCODINGได้
Stew

4
ป้องกันไม่ให้ออกจากตัวอักษรที่ไม่ถูกต้อง (หลีกเลี่ยงillegal input sequence at positionข้อความ) และแทนที่ตัวอักษร "แปลก" ที่มีตัวอักษร iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt"คล้ายกัน":
knb

ฉันชอบสิ่งนี้เพราะมันเป็นมาตรฐานสำหรับแพลตฟอร์ม NIX ส่วนใหญ่ แต่ยังเห็นเป็นกลุ่มตัวเลือกคำสั่ง (นามแฝง: ex) ดังต่อไปนี้ ข้อมูลเพิ่มเติม: (1) คุณ (อาจ) ไม่จำเป็นต้องระบุ-f(จาก) iconvตัวเลือกที่มี (2) file --mime-encoding <file/s>คำสั่งสามารถช่วยให้คุณเข้าใจการเข้ารหัสตั้งแต่แรก
fr13d

1
FWIW fileคำสั่งรายงานแหล่งที่มาของฉันเป็น UTF-16 Little Endian; ทำงานiconv -f UTF-16 -t UTF-8...เปลี่ยนให้มันไม่ถูกต้อง ASCII และฉันได้เพื่อระบุอย่างชัดเจนiconv -f UTF-16LE...เพื่อส่งออก UTF-8
เพลโต

90

ลองใช้ VIM

ถ้าคุณมีvimคุณสามารถใช้นี้

ไม่ได้ทดสอบสำหรับการเข้ารหัสทุกครั้ง

ส่วนที่น่าสนใจเกี่ยวกับสิ่งนี้คือคุณไม่จำเป็นต้องรู้รหัสที่มา

vim +"set nobomb | set fenc=utf8 | x" filename.txt

พึงระวังว่าคำสั่งนี้แก้ไขไฟล์โดยตรง


ส่วนคำอธิบาย!

  1. +: ใช้โดย vim เพื่อป้อนคำสั่งโดยตรงเมื่อเปิดไฟล์ มักใช้เพื่อเปิดไฟล์ที่บรรทัดเฉพาะ:vim +14 file.txt
  2. |: ตัวคั่นของหลายคำสั่ง (เช่น;ในทุบตี)
  3. set nobomb : ไม่มี utf-8 BOM
  4. set fenc=utf8: ตั้งค่าการเข้ารหัสใหม่เพื่อ UTF-8 เชื่อมโยง doc
  5. x : บันทึกและปิดไฟล์
  6. filename.txt : พา ธ ไปยังไฟล์
  7. ": qotes มาที่นี่เพราะท่อ (มิฉะนั้นทุบตีจะใช้พวกเขาเป็นท่อทุบตี)

ค่อนข้างเย็น แต่ค่อนข้างช้า มีวิธีการเปลี่ยนนี้เพื่อแปลงจำนวนไฟล์ในครั้งเดียว (ทำให้ประหยัดค่าใช้จ่ายในการเริ่มต้นเป็นกลุ่มของ) หรือไม่?
DomQ

ขอบคุณสำหรับคำอธิบาย! ฉันมีช่วงเวลาที่ยากลำบากในการเริ่มต้นไฟล์จนกว่าฉันจะอ่านเกี่ยวกับการตั้งค่าระเบิด / ขุนนาง
jjwdesign

1
np, นอกจากนี้คุณสามารถดู bom ได้ถ้าคุณใช้vim -bหรือhead file.txt|cat -e
Boop

1
ตัวอย่างเช่น:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel

ฉันใช้นี้เพื่อแปลงการเข้ารหัสไฟล์ CSV และตื่นเต้นมากเมื่อฉันเห็น charset มีการเปลี่ยนแปลงแน่นอน แต่น่าเสียดายที่เมื่อฉันไปโหลดไฟล์ลงใน MySQL มันมีจำนวนคอลัมน์ที่แตกต่างจากก่อนหน้านี้ก่อนที่จะใช้คำสั่ง vim สงสัยว่ามันจะเป็นไปได้เพียงแค่เปิดไฟล์แปลงการเข้ารหัสและบันทึก / ปิดไฟล์ในขณะที่ปล่อยให้เนื้อหาไฟล์อื่น ๆ ทั้งหมดเหมือนกันหรือไม่
NightOwlPrgmr

39

ภายใต้ Linux คุณสามารถใช้คำสั่งrecode ที่ทรงพลังเพื่อลองและแปลงระหว่างชุดอักขระที่แตกต่างกันรวมถึงปัญหาการสิ้นสุดบรรทัดใด ๆ recode -lจะแสดงรูปแบบและการเข้ารหัสทั้งหมดที่เครื่องมือสามารถแปลงได้ มันน่าจะเป็นรายการที่ยาวมาก


คุณแปลงเป็นLFอย่างไร นอกจากนี้/CRและ/CR-LFแต่ไม่มี/LF
แอรอน Franke

21

iconv (1)

iconv -f FROM-ENCODING -t TO-ENCODING file.txt

นอกจากนี้ยังมีเครื่องมือที่ใช้ iconv ในหลายภาษา


1
สิ่งที่เกี่ยวกับการตรวจจับการเข้ารหัสอัตโนมัติ?
Aaron Franke

20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

เวอร์ชันที่สั้นที่สุดหากคุณสามารถสันนิษฐานได้ว่าอินพุต BOM นั้นถูกต้อง:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt

1
ต่อไปนี้เป็นรุ่นที่สั้นกว่าที่ทำงานได้ดีขึ้น gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Larry Battle

@ LarryBattle: Set-ContentทำงานOut-Fileอย่างไรดีกว่า?
Jay Bazuzi

... โอ้ ฉันคิดว่าพวกเขาเกือบจะเหมือนกัน ฉันมีปัญหาในการใช้งานตัวอย่างของคุณเนื่องจากฉันสมมติว่าทั้งสองเวอร์ชันใช้file-utf8.txtไฟล์เดียวกันสำหรับอินพุตเนื่องจากทั้งคู่มีไฟล์เอาต์พุตเหมือนfile-utf7.txtกัน
Larry Battle

นี่จะยอดเยี่ยมจริงๆยกเว้นว่าจะไม่รองรับ UTF16 รองรับ UTF32 แต่ไม่ใช่ UTF16! ฉันไม่จำเป็นต้องแปลงไฟล์ยกเว้นว่ามีซอฟต์แวร์ Microsoft (fe SQL server bcp) จำนวนมากยืนยันใน UTF16 - และยูทิลิตี้ของพวกเขาจะไม่แปลงเป็นไฟล์ สนใจที่จะพูดน้อย
โนอาห์

ฉันพยายามgc -en Ascii readme.html | Out-File -en UTF8 readme.htmlแต่มันแปลงไฟล์เป็น utf-8 แต่แล้วมันว่างเปล่า! Notepad ++ บอกว่าไฟล์เป็นรูปแบบ Ansi แต่อ่านเพราะผมเข้าใจว่ามันไม่ใช่ charset ที่ใช้ได้ ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

16

ลองใช้ฟังก์ชั่น iconv Bash

ฉันใส่สิ่งนี้ลงใน.bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

.. เพื่อให้สามารถแปลงไฟล์เช่นนี้:

utf8 MyClass.java

8
มันเป็นสไตล์ที่ดีกว่าที่จะใช้ tmp = $ (mktmp) เพื่อสร้างไฟล์ชั่วคราว นอกจากนี้บรรทัดที่มี rm ซ้ำซ้อน
LMZ

1
คุณสามารถทำฟังก์ชั่นนี้ให้สมบูรณ์ด้วยรูปแบบการตรวจจับอินพุตอัตโนมัติได้หรือไม่?
mlibre

3
ระวังฟังก์ชั่นนี้จะลบไฟล์อินพุตโดยไม่ตรวจสอบว่าการโทร iconv ประสบความสำเร็จ
philwalk

สิ่งนี้จะเปลี่ยนเนื้อหาของไฟล์ข้อความ ฉันรันสิ่งนี้บน UTF-8 พร้อม BOM โดยคาดหวังว่าจะได้ออก UTF-8 ที่ไม่มีไฟล์ BOM แต่จะมีการเตรียมไว้เมื่อเริ่มต้นไฟล์
แอรอน Franke

14

ลอง Notepad ++

บน Windows ก็สามารถที่จะใช้ Notepad ++ ที่จะทำแปลงจากISO-8859-1เพื่อUTF-8 คลิกแล้ว"Encoding""Convert to UTF-8"


13

Oneliner ใช้ find พร้อมการตรวจจับชุดอักขระอัตโนมัติ

การเข้ารหัสอักขระของไฟล์ข้อความที่ตรงกันทั้งหมดจะถูกตรวจพบโดยอัตโนมัติและไฟล์ข้อความที่ตรงกันทั้งหมดจะถูกแปลงเป็นการutf-8เข้ารหัส:

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

เพื่อดำเนินการตามขั้นตอนเหล่านี้เปลือกย่อยshจะใช้กับ-execวิ่งหนึ่งซับกับ-cธงและผ่านชื่อไฟล์เป็นอาร์กิวเมนต์ตำแหน่งด้วย"$1" -- {}ในระหว่างที่ไฟล์ที่ส่งออกเป็นชื่อชั่วคราวutf-8converted

โดยfile -biวิธีการ:

  • -b, --brief ห้ามต่อท้ายชื่อไฟล์ไปยังบรรทัดเอาต์พุต (โหมดสั้น ๆ )

  • -i, --mime ทำให้เกิดคำสั่งไฟล์สตริงชนิดไมม์เอาท์พุทมากกว่าแบบดั้งเดิมมากขึ้นคนที่อ่านของมนุษย์ ดังนั้นจึงอาจกล่าวได้เช่นมากกว่าtext/plain; charset=us-ascii คำสั่งตัดนี้เพียงเป็นถูกต้องตามASCII textsedus-asciiiconv

findคำสั่งเป็นประโยชน์อย่างมากสำหรับระบบอัตโนมัติการจัดการไฟล์ดังกล่าว คลิกที่นี่เพื่อเพิ่มเติมfindมากมาย


3
ฉันต้องปรับแก้ปัญหานี้เล็กน้อยเพื่อให้ทำงานบน Mac OS X ได้อย่างน้อยในรุ่นของฉัน find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
Brian J. Miller

1
รหัสของคุณใช้ได้กับ Windows 7 ด้วย MinGW-w64 (เวอร์ชั่นล่าสุด) ด้วย ขอบคุณสำหรับการแบ่งปัน!
silvioprog

@rmuller sedคำสั่งมีจุดประสงค์เพื่อให้สามารถตรวจจับการเข้ารหัสอักขระได้โดยอัตโนมัติ ฉันได้ขยายคำตอบเพื่ออธิบายในตอนนี้ มันจะสุภาพเกี่ยวกับผู้อ่านเพื่อลบความคิดเห็นที่ไม่เกี่ยวข้องที่เหลืออยู่ ขอบคุณ.
Serge Stroobandt

@SergeStroobandt บางทีฉันยังไม่ชัดเจนพอ ประเด็นของฉันคือเมื่อคุณใช้ "file -b - การเข้ารหัสแบบไมม์" แทน "file -bi" ไม่จำเป็นต้องกรองผลลัพธ์ด้วย sed คำสั่งนี้ส่งคืนการเข้ารหัสไฟล์แล้วเท่านั้น ในตัวอย่างของคุณ "us-ascii"
rmuller

ดูเหมือนจะไม่ทำอะไรกับฉันบน Linux ฉันบันทึกไฟล์เป็น UTF-8 ด้วย BOM และคาดว่าจะแปลงเป็น UTF-8 โดยไม่มี BOM และไม่ได้ทำ
Aaron Franke

3

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);


1
คำสั่งนี้ใช้งานได้ดีเมื่อแปลงสตริง แต่ไม่เหมาะกับไฟล์
jjwdesign

2

DOS / Windows: ใช้หน้ารหัส

chcp 65001>NUL
type ascii.txt > unicode.txt

คำสั่งchcpสามารถใช้ในการเปลี่ยนหน้ารหัส รหัสหน้า 65001 เป็นชื่อ Microsoft สำหรับ UTF-8 หลังจากตั้งค่าหน้ารหัสผลลัพธ์ที่สร้างโดยคำสั่งต่อไปนี้จะเป็นของชุดรหัสหน้า


1

เพื่อเขียนไฟล์คุณสมบัติ (Java) ปกติฉันจะใช้สิ่งนี้ใน linux (สะระแหน่และการกระจาย Ubuntu):

$ native2ascii filename.properties

ตัวอย่างเช่น:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PS: ฉันเขียนหมายเลขดำเนินการหนึ่ง / สองใน portugues เพื่อบังคับใช้อักขระพิเศษ

ในกรณีของฉันในการดำเนินการครั้งแรกฉันได้รับข้อความนี้:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

เมื่อฉันติดตั้งตัวเลือกแรก (gcj-5-jdk) ปัญหาก็เสร็จสิ้น

ฉันหวังว่าสิ่งนี้จะช่วยใครบางคน




0

เครื่องมือที่ฉันชอบคือ Jedit (โปรแกรมแก้ไขข้อความที่ใช้จาวา) ซึ่งมีคุณสมบัติสองอย่างที่สะดวกมาก:

  • หนึ่งที่ช่วยให้ผู้ใช้สามารถโหลดข้อความที่มีการเข้ารหัสที่แตกต่างกัน (และเป็นเช่นนี้เพื่อควบคุมผลการมองเห็น)
  • อย่างใดอย่างหนึ่งซึ่งจะช่วยให้ผู้ใช้สามารถเลือกการเข้ารหัสอย่างชัดเจน (และจุดสิ้นสุดของบรรทัดถ่าน) ก่อนที่จะบันทึกอีก

0

เพียงแค่เปลี่ยนการเข้ารหัสไฟล์ที่โหลดใน IntelliJ IDEA IDE ทางด้านขวาของแถบสถานะ (ด้านล่าง) ที่มีการระบุชุดอักขระปัจจุบัน มันแจ้งให้โหลดซ้ำหรือแปลงใช้แปลง ตรวจสอบให้แน่ใจว่าคุณได้สำรองไฟล์ต้นฉบับล่วงหน้า


0

หากแอปพลิเคชัน macOS GUI เป็นขนมปังและเนยของคุณSubEthaEditเป็นตัวแก้ไขข้อความที่ฉันมักจะไปใช้เพื่อการเข้ารหัส - การบิด - "ตัวอย่างการแปลง" ช่วยให้คุณเห็นอักขระที่ไม่ถูกต้องทั้งหมดในการเข้ารหัสเอาต์พุตและแก้ไข / ลบออก

และตอนนี้มันเป็นโอเพ่นซอร์สดังนั้น yay สำหรับพวกเขา😉


-1

ตามที่อธิบายไว้ในฉันจะแก้ไขการเข้ารหัสอักขระของไฟล์ได้อย่างไร Synalyze It! ช่วยให้คุณสามารถแปลงบน OS X ระหว่างการเข้ารหัสทั้งหมดได้รับการสนับสนุนโดยห้องสมุดห้องไอซียู

นอกจากนี้คุณสามารถแสดงไบต์ของไฟล์ที่แปลเป็น Unicode จากการเข้ารหัสทั้งหมดเพื่อดูอย่างรวดเร็วซึ่งเป็นไฟล์ที่ถูกต้องสำหรับไฟล์ของคุณ

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