2009-03-08 61 views
5

Tôi có một yêu cầu trong đó một khách hàng sẽ cung cấp một tệp trong mã hóa ANSI, nhưng hệ thống của tôi chỉ có thể đọc thành công một tệp trong UNICODE. Vậy làm cách nào để giải quyết vấn đề này? Tôi biết khi tôi "lưu dưới dạng" tệp thành UNICODE, mã hóa tệp được chọn. Rất khó để làm cho khách hàng tuân thủ yêu cầu của chúng tôi. Vì vậy, tôi có thể có bất kỳ chương trình hàng loạt cho thư mục này để chuyển đổi tập tin này vào UNICODE và sau đó nhận?Cách chuyển đổi tập tin * .txt thành Unicode

+1

Khi bạn nói 'Unicode', bạn có nghĩa là UTF8, UTF16, UTF32 hoặc một số đại diện khác không? Và làm thế nào bạn sẽ phát hiện ra mã nguồn được thiết lập khi nó không phải là Unicode? nền tảng của bạn là gì? –

+3

Hầu hết mọi người nghĩ UTF-32 = Unicode. Tôi đổ lỗi cho MS và các tùy chọn "Save As" của họ cho ý tưởng này là rất phổ biến trong quần chúng. Buồn khi thấy một nhà phát triển (những người nên biết rõ hơn) chia sẻ nó. –

+0

MS sử dụng chủ yếu là UCS-2, không phải UTF-32. – flodin

Trả lời

5

recode có thể thực hiện công việc.

17

iconv thể làm điều đó:

Usage: iconv [OPTION...] [FILE...] 
Convert encoding of given files from one encoding to another. 

Input/Output format specification: 
    -f, --from-code=NAME  encoding of original text 
    -t, --to-code=NAME   encoding for output 

Information: 
    -l, --list     list all known coded character sets 

Output control: 
    -c       omit invalid characters from output 
    -o, --output=FILE   output file 
    -s, --silent    suppress warnings 
     --verbose    print progress information 

    -?, --help     Give this help list 
     --usage    Give a short usage message 
    -V, --version    Print program version 

Mandatory or optional arguments to long options are also mandatory or optional 
for any corresponding short options. 

For bug reporting instructions, please see: 
<http://www.gnu.org/software/libc/bugs.html>. 
4

Bạn cũng có thể dễ dàng chuyển đổi bảng mã trong python:

inf = open("infile.txt") 
data = inf.read().decode("latin1") 
inf.close() 

outf = open("outfile.txt", "w") 
outf.write(data.encode("utf-8")) 
outf.close() 
3

Dưới đây là một giải pháp Powershell

$lines = gc "pathToFile" 
$lines | out-file -enconding Unicode 
11

Cả ANSI hay Unicode là mã hóa. Bạn sẽ phải biết mã ANSI của tệp đầu vào và Unicode enco ding (UTF8 hoặc UTF16 - LE hoặc BE) trước khi bạn có thể sử dụng một trong các công cụ được đề xuất (chẳng hạn như iconv)

+0

Ước gì tôi có thể upvote điều này nhiều hơn. Đối với hầu hết người dùng Windows, "Unicode" có nghĩa là UTF32. Hầu hết các ngôn ngữ Tây Âu sử dụng bảng mã Latin1, vì vậy hầu hết mọi người cho rằng đó là "ANSI" mã hóa (một lần nữa, tôi đổ lỗi cho MS cho việc sử dụng từ của họ trong "Save As" tùy chọn của họ). –

+0

Chúng ta có thể thêm rằng nhìn vào Control Panel-> Regional Settings-> Advanced Options sẽ hiển thị các mã ANSI nào được cài đặt và sử dụng. –

+3

Trên hệ thống Windows, "Unicode" thường có nghĩa là UTF-16. –

1

Tôi đã đi qua một số công cụ được đề cập ở trên, nhiều công cụ yêu cầu dòng lệnh.

Tôi đã tìm thấy cách dễ dàng hơn để chuyển đổi tệp trong Windows.

  1. Install Notepad2 (http://www.flos-freeware.ch/). Đó là mã nguồn mở và miễn phí.

  2. Mở tập tin có mã hóa ANSI,

  3. Double Click "ANSI" chữ ở phía dưới,

  4. Chọn Encoding mới như "utf8"

  5. Lưu tập tin.

Chỉ cần một vài lần nhấp để hoàn thành công việc.

Ngoài ra, bạn có thể dễ dàng xem lại nội dung sau khi thực hiện để kiểm tra kỹ.

Notepad2 có nhiều lợi ích khác nhau trên Notepad. đang được đánh dấu, Undo/Redo, vv

: D

+0

Tôi không thấy cách thay đổi mã hóa bằng cách sử dụng GUI Notepad2 dễ hơn là sử dụng dòng lệnh, đặc biệt là với nhiều tệp để làm? – ehambright

+0

GUI là không có trí tuệ: X Commandline cần sự phụ thuộc ... notepad ++ chỉ cần nhấp vào nhấp chuột ... – CodeFarmer

0

của Ruby oneliner, fwiw:

ruby -e 'STDOUT.write STDIN.read.force_encoding(Encoding::WINDOWS_1252).encode!(Encoding::UTF_8)' <infile.csv> outfile.csv 

Nếu tập tin đầu vào của bạn là khủng khiếp bạn có thể cần tack STDIN.binmode; STDOUT.binmode; trên mặt trước của kịch bản Ruby.

Các vấn đề liên quan