Cách tốt nhất để chuyển đổi tập tin văn bản giữa các bộ ký tự?


526

Công cụ hoặc phương pháp nhanh nhất, dễ nhất để chuyển đổi tệp văn bản giữa các bộ ký tự là gì?

Cụ thể, tôi cần chuyển đổi từ UTF-8 sang ISO-8859-15 và ngược lại.

Mọi thứ diễn ra: một lớp trong ngôn ngữ kịch bản yêu thích của bạn, công cụ dòng lệnh hoặc các tiện ích khác cho HĐH, trang web, v.v.

Giải pháp tốt nhất cho đến nay:

Trên Linux / UNIX / OS X / cygwin:

  • Iconv Gnu được đề xuất bởi Troels Arvin được sử dụng tốt nhất làm bộ lọc . Nó dường như là phổ biến có sẵn. Thí dụ:

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

    Như Ben đã chỉ ra , có một trình chuyển đổi trực tuyến sử dụng iconv .

  • hóa Gnu ( thủ công ) được đề xuất bởi Cheekysoft sẽ chuyển đổi một hoặc một số tệp tại chỗ . Thí dụ:

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

    Cái này sử dụng các bí danh ngắn hơn:

    $ recode utf8..l9 in.txt
    

    Recode cũng hỗ trợ các bề mặt có thể được sử dụng để chuyển đổi giữa các loại kết thúc dòng và mã hóa khác nhau:

    Chuyển đổi dòng mới từ LF (Unix) sang CR-LF (DOS):

    $ recode ../CR-LF in.txt
    

    Tệp mã hóa Base64:

    $ recode ../Base64 in.txt
    

    Bạn cũng có thể kết hợp chúng.

    Chuyển đổi tệp UTF8 được mã hóa Base64 với các kết thúc dòng Unix sang tệp Latin 1 được mã hóa Base64 với các kết thúc dòng Dos:

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

Trên Windows với Powershell ( Jay Bazuzi ):

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

    (Mặc dù không có hỗ trợ ISO-8859-15; nó nói rằng các bộ ký tự được hỗ trợ là unicode, utf7, utf8, utf32, ascii, bigendianunicode, default và OEM.)

Biên tập

Bạn có nghĩa là hỗ trợ iso-8859-1? Sử dụng "Chuỗi" thực hiện điều này, ví dụ như ngược lại

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

Lưu ý: Các giá trị liệt kê có thể là "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii".


Tôi đã thử gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlnhưng nó chuyển đổi tập tin thành utf-8 nhưng sau đó nó trống! Notepad ++ nói rằng tệp có định dạng Ansi nhưng đọc lên vì tôi hiểu nó thậm chí không phải là một bộ ký tự hợp lệ ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

2
Chỉ cần đi qua điều này để tìm kiếm một câu trả lời cho một câu hỏi liên quan - tóm tắt tuyệt vời! Chỉ cần nghĩ rằng nó đáng để thêm vào recodecũng sẽ hoạt động như một bộ lọc nếu bạn không vượt qua bất kỳ tên tệp nào, ví dụ:recode utf8..l9 < in.txt > out.txt
Jez

iconv.com/iconv.htm dường như đã chết đối với tôi? (hết thời gian)
Andrew Newby

2
Nếu bạn sử dụng enca, bạn không cần chỉ định mã hóa đầu vào. Nó thường là đủ chỉ để xác định ngôn ngữ : enca -L ru -x utf8 FILE.TXT.
Alexander Pozdneev

1
Trên thực tế, iconv hoạt động tốt hơn nhiều như một trình chuyển đổi tại chỗ thay vì bộ lọc. Chuyển đổi một tệp có hơn 2 triệu dòng sử dụng iconv -f UTF-32 -t UTF-8 input.csv > output.csvchỉ lưu khoảng bảy trăm nghìn dòng, chỉ một phần ba. Sử dụng phiên bản tại chỗ đã iconv -f UTF-32 -t UTF-8 file.csvchuyển đổi thành công tất cả 2 triệu dòng.
Nicolay77

Câu trả lời:


246

Phương pháp tiện ích độc lập

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

Bạn không cần phải xác định một trong hai đối số này. Chúng sẽ mặc định cho miền địa phương hiện tại của bạn, thường là UTF-8.


4
Đối với bất kỳ ai khác bị vấp ngã bởi các phiên bản không dấu gạch ngang không có sẵn, có vẻ như các phiên bản biểu tượng OSX (và có thể là tất cả BSD) không hỗ trợ các bí danh không dấu gạch ngang cho các mã hóa UTF- * khác nhau. iconv -l | grep UTFsẽ cho bạn biết tất cả các mã hóa liên quan đến UTF mà bản sao iconv của bạn hỗ trợ.
coredumperror

14
Bạn không biết mã hóa tập tin đầu vào của bạn? Sử dụng chardet in.txtđể tạo ra một dự đoán tốt nhất. Kết quả có thể được sử dụng như ENCODING iconv -f ENCODING.
Hầm

4
Ngăn chặn thoát tại các ký tự không hợp lệ (tránh illegal input sequence at positiontin nhắn) và thay thế các ký tự "lạ" bằng các ký tự "tương tự" : iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
knb 6/2/2015

Tôi thích điều này bởi vì nó là tiêu chuẩn trên hầu hết các nền tảng NIX. Nhưng cũng thấy tùy chọn lệnh VIM (bí danh ex:) bên dưới . Thông tin bổ sung: (1) bạn (có thể) không cần chỉ định -ftùy chọn (từ) với iconv. (2) file --mime-encoding <file/s>lệnh có thể giúp bạn tìm ra mã hóa ở vị trí đầu tiên.
fr13d

1
FWIW filelệnh đã báo cáo nguồn của tôi là UTF-16 Little Endian; khi chạy đã iconv -f UTF-16 -t UTF-8...chuyển đổi nó không chính xác thành ASCII, tôi phải xác định rõ ràng iconv -f UTF-16LE...để xuất UTF-8
Plato

90

Hãy thử VIM

Nếu bạn có vimbạn có thể sử dụng này:

Không được kiểm tra cho mọi mã hóa.

Điều thú vị về điều này là bạn không cần phải biết mã hóa nguồn

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

Lưu ý rằng lệnh này sửa đổi trực tiếp tệp


Phần giải thích!

  1. +: Được sử dụng bởi vim để nhập lệnh trực tiếp khi mở tệp. Thông thường được sử dụng để mở một tập tin tại một dòng cụ thể:vim +14 file.txt
  2. |: Dấu phân cách của nhiều lệnh (như ;trong bash)
  3. set nobomb : không có utf-8 BOM
  4. set fenc=utf8: Đặt mã hóa mới thành liên kết tài liệu utf-8
  5. x : Lưu và đóng tệp
  6. filename.txt : đường dẫn đến tập tin
  7. ": qotes ở đây vì đường ống. (nếu không bash sẽ sử dụng chúng như bash pipe)

Khá mát mẻ, nhưng hơi chậm. Có cách nào để thay đổi điều này để chuyển đổi một số tệp cùng một lúc (do đó tiết kiệm chi phí khởi tạo của vim) không?
DomQ

Cảm ơn bạn đã giải thích! Tôi đã có một thời gian khó khăn với việc bắt đầu tập tin cho đến khi tôi đọc về cài đặt bom / nobomb.
jjwdesign

1
np, thêm bạn có thể xem bom nếu bạn sử dụng vim -bhoặchead file.txt|cat -e
Boop

1
ví dụ:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel

Tôi đã sử dụng điều này để chuyển đổi mã hóa các tệp CSV và thực sự phấn khích khi tôi thấy bộ ký tự đã thực sự thay đổi. Thật không may, khi tôi tải tệp vào MySQL, nó có số cột khác với số cột trước đó trước khi chạy lệnh vim. Tự hỏi liệu có thể chỉ mở tệp, chuyển đổi mã hóa và lưu / đóng tệp trong khi để tất cả các nội dung tệp khác giống nhau không?
NightOwlPrgmr

39

Trong Linux, bạn có thể sử dụng lệnh recode rất mạnh mẽ để thử và chuyển đổi giữa các bộ ký tự khác nhau cũng như bất kỳ vấn đề kết thúc dòng nào. recode -l sẽ hiển thị cho bạn tất cả các định dạng và mã hóa mà công cụ có thể chuyển đổi giữa. Nó có khả năng là một danh sách dài RẤT.


Làm thế nào để bạn chuyển đổi sang LF? Có /CR/CR-LFnhưng không/LF
Aaron Franke

21

iconv (1)

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

Ngoài ra còn có các công cụ dựa trên iconv trong nhiều ngôn ngữ.


1
Điều gì về tự động phát hiện mã hóa ban đầu?
Aaron Franke

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

Phiên bản ngắn nhất, nếu bạn có thể cho rằng BOM đầu vào là chính xác:

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

1
Đây là một phiên bản ngắn hơn hoạt động tốt hơn. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Trận chiến

@LarryBattle: Làm thế nào để Set-Contentlàm việc tốt hơn Out-File?
Jay Bazuzi

...Oh. Tôi đoán chúng gần giống nhau. Tôi gặp sự cố khi chạy ví dụ của bạn vì tôi cho rằng cả hai phiên bản đều sử dụng cùng một file-utf8.txttệp cho đầu vào vì cả hai đều có cùng một tệp đầu ra như file-utf7.txt.
Trận chiến

Điều này sẽ thực sự tuyệt vời, ngoại trừ việc nó không hỗ trợ UTF16. Nó hỗ trợ UTF32, nhưng không hỗ trợ UTF16! Tôi không cần phải chuyển đổi tệp, ngoại trừ rất nhiều phần mềm của Microsoft (máy chủ SQL SQL bcp) khăng khăng trên UTF16 - và sau đó tiện ích của họ sẽ không chuyển đổi sang phần mềm. Thú vị để nói rằng ít nhất.

Tôi đã thử gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlnhưng nó chuyển đổi tập tin thành utf-8 nhưng sau đó nó trống! Notepad ++ nói rằng tệp có định dạng Ansi nhưng đọc lên vì tôi hiểu nó thậm chí không phải là một bộ ký tự hợp lệ ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

16

Hãy thử chức năng iconv Bash

Tôi đã đặt cái này vào .bashrc:

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

.. để có thể chuyển đổi các tập tin như vậy:

utf8 MyClass.java

8
phong cách tốt hơn là sử dụng tmp = $ (mktmp) để tạo một tệp tạm thời. Ngoài ra, dòng với rm là dư thừa.
LMZ

1
bạn có thể hoàn thành chức năng này với tự động phát hiện định dạng đầu vào không?
mlibre

3
hãy cẩn thận, chức năng này xóa tệp đầu vào mà không cần xác minh rằng cuộc gọi iconv đã thành công.
philwalk

Điều này thay đổi nội dung của tệp văn bản. Tôi đã chạy nó trên UTF-8 với BOM với mong muốn lấy ra UTF-8 mà không có tệp BOM, nhưng nó đã được chuẩn bị khi bắt đầu tập tin.
Aaron Franke

14

Dùng thử Notepad ++

Trên Windows tôi đã có thể sử dụng Notepad ++ để thực hiện chuyển đổi từ ISO-8859-1 sang UTF-8 . Nhấn "Encoding"và sau đó "Convert to UTF-8".


13

Oneliner sử dụng find, với tính năng phát hiện bộ ký tự tự động

Mã hóa ký tự của tất cả các tệp văn bản phù hợp sẽ được phát hiện tự động và tất cả các tệp văn bản phù hợp được chuyển đổi thành utf-8mã hóa:

$ 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"' -- {} \;

Để thực hiện các bước này, một lớp vỏ phụ shđược sử dụng với -exec, chạy một lớp lót với -ccờ và chuyển tên tệp làm đối số vị trí "$1"với -- {}. Ở giữa, utf-8tập tin đầu ra được đặt tên tạm thời converted.

Trong đó file -bicó nghĩa là:

  • -b, --brief Không thêm tên tập tin vào dòng đầu ra (chế độ ngắn).

  • -i, Làm --mime cho lệnh tập tin xuất ra các chuỗi loại mime thay vì các chuỗi truyền thống dễ đọc hơn của con người. Vì vậy, nó có thể nói ví dụ text/plain; charset=us-asciichứ không phải ASCII text. Các sedvết cắt lệnh này để chỉ us-asciinhư là yêu cầu của iconv.

Các findlệnh là rất hữu ích cho tự động hóa quản lý tập tin như vậy. Nhấn vào đây để thêm findgalore .


3
Tôi đã phải điều chỉnh giải pháp này một chút để hoạt động trên Mac OS X, ít nhất là ở phiên bản của tôi. 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
Mã của bạn cũng hoạt động trên Windows 7 với MinGW-w64 (phiên bản mới nhất). Cảm ơn đã chia sẻ nó!
silvioprog

@rmuller sedLệnh có mục đích, cho phép tự động phát hiện mã hóa ký tự. Tôi đã mở rộng câu trả lời để giải thích điều này bây giờ. Sẽ là lịch sự liên quan đến độc giả để xóa bất kỳ ý kiến ​​không liên quan còn lại. Cảm ơn bạn.
Serge Stroobandt

@SergeStroobandt Có lẽ tôi không đủ rõ ràng. Quan điểm của tôi là khi bạn sử dụng "file -b --mime-mã hóa" thay vì "file -bi" thì không cần phải lọc kết quả với sed. Lệnh này đã chỉ trả về mã hóa tập tin. Vì vậy, trong ví dụ của bạn "us-ascii"
rmuller

Điều này dường như không thực sự làm bất cứ điều gì cho tôi trên Linux. Tôi đã lưu một tệp dưới dạng UTF-8 với BOM và dự kiến ​​nó sẽ chuyển đổi thành UTF-8 mà không có BOM và không được.
Aaron Franke

3

Biểu tượng PHP ()

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


1
Câu lệnh này hoạt động rất tốt khi chuyển đổi chuỗi, nhưng không phải cho các tệp.
jjwdesign

2

DOS / Windows: sử dụng trang Code

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

Lệnh chcpcó thể được sử dụng để thay đổi trang mã. Mã trang 65001 là tên Microsoft cho UTF-8. Sau khi thiết lập trang mã, đầu ra được tạo bởi các lệnh sau sẽ là của trang mã được đặt.


1

để ghi tệp thuộc tính (Java) thông thường tôi sử dụng tệp này trong linux (bản phân phối mint và ubfox):

$ native2ascii filename.properties

Ví dụ:

$ 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: Tôi đã viết Thực thi số một / hai trong các danh mục để buộc các nhân vật đặc biệt.

Trong trường hợp của tôi, trong lần thực hiện đầu tiên tôi đã nhận được thông báo này:

$ 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>

Khi tôi cài đặt tùy chọn đầu tiên (gcj-5-jdk), sự cố đã kết thúc.

Tôi hy vọng điều này sẽ giúp ai đó.




0

Công cụ yêu thích của tôi cho việc này là Jedit (trình soạn thảo văn bản dựa trên java) có hai tính năng rất tiện lợi:

  • Một cho phép người dùng tải lại một văn bản với một mã hóa khác (và, như vậy, để kiểm soát trực quan kết quả)
  • Một số khác cho phép người dùng chọn rõ ràng mã hóa (và cuối dòng char) trước khi lưu

0

Chỉ cần thay đổi mã hóa tệp được tải trong IntelliJ IDEA IDE, ở bên phải thanh trạng thái (phía dưới), trong đó bộ ký tự hiện tại được chỉ định. Nó nhắc để Tải lại hoặc Chuyển đổi, sử dụng Chuyển đổi. Hãy chắc chắn rằng bạn đã sao lưu tập tin gốc trước.


0

Nếu các ứng dụng GUI macOS là bánh mì và bơ của bạn, SubEthaEdit là trình soạn thảo văn bản mà tôi thường dùng để mã hóa - "xem trước chuyển đổi" của nó cho phép bạn xem tất cả các ký tự không hợp lệ trong mã hóa đầu ra và sửa / xóa chúng.

Và bây giờ nó là nguồn mở , vì vậy hãy yay cho họ.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.