2009-03-08 15 views
5

Mam wymaganie, gdy klient dostarczy plik w kodowaniu ANSI, ale mój system może tylko z powodzeniem odczytać plik w standardzie UNICODE. Jak więc rozwiązać ten problem? Wiem, kiedy zapisuję plik jako kodowany w standardzie UNICODE, a plik jest pobierany. Trudno jest dostosować klienta do naszej prośby. Więc czy mogę mieć jakiś program wsadowy dla tego folderu, aby przekonwertować ten plik na UNICODE, a następnie odebrać?Jak przekonwertować plik * .txt na Unicode

+1

Kiedy mówisz "Unicode", masz na myśli UTF8, UTF16, UTF32 lub jakąś inną reprezentację? Jak rozpoznać kod źródłowy, gdy nie jest to kod Unicode? Na której platformie jesteś? –

+3

Większość ludzi myśli UTF-32 = Unicode. Obwiniam stwardnienie rozsiane i ich "Zapisz jako" opcje dla tego pomysłu, który jest tak powszechny wśród mas. Smutno, gdy zobaczysz programistę (który powinien wiedzieć lepiej), który go udostępnia. –

+0

MS używa głównie UCS-2, a nie UTF-32. – flodin

Odpowiedz

17

iconv może to zrobić:

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

Można również łatwo konwertować kodowania w Pythonie:

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

Oto rozwiązanie PowerShell

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

Ani ANSI ani Unicode są kodowania. Będziesz musiał znać stronę kodową ANSI pliku wejściowego i enco Unicode ding (UTF8 lub UTF16 - LE lub BE) przed użyciem jednego z sugerowanych narzędzi (takich jak iconv)

+0

Żałuję, że nie mogłem tego zrobić więcej. W przypadku większości użytkowników systemu Windows "Unicode" oznacza UTF32. Większość języków zachodnioeuropejskich używa strony kodowej Latin1, więc większość ludzi zakłada kodowanie "ANSI" (ponownie, winię MS za użycie słów w ich opcjach "Zapisz jako"). –

+0

Możemy dodać, że patrząc na Panel Sterowania-> Ustawienia regionalne-> Opcje zaawansowane pokaże, które strony kodowe ANSI są instalowane i używane. –

+3

W systemach Windows "Unicode" zwykle oznacza UTF-16. –

1

Przeszedłem przez niektóre narzędzia wspomniane powyżej, wiele z nich wymaga linii poleceń.

Znalazłem o wiele łatwiejszy sposób konwertowania plików w systemie Windows.

  1. Instalacja Notepad2 (http://www.flos-freeware.ch/). Jest otwarty i bezpłatny.

  2. Otwórz plik ma kodowanie ANSI

  3. kliknij dwukrotnie "ANSI" słowo na dole,

  4. wybrać nowe kodowanie takie jak "utf8"

  5. zapisać plik.

To tylko kilka kliknięć, aby wykonać pracę.

Co więcej, można raz przeglądać zawartość, aby dokonać podwójnego sprawdzenia.

Notepad2 ma wiele zalet w stosunku do Notatnika. Kod podświetleniu Undo/Redo itp

: D

+0

Nie widzę, jak zmiana kodowania za pomocą interfejsu GUI Notepad2 jest łatwiejsza niż użycie wiersza poleceń, szczególnie w przypadku wielu plików? – ehambright

+0

GUI jest bezużyteczne: X Polecenie wymaga zależności ... notepad ++ to po prostu kliknij, kliknij, kliknij ... – CodeFarmer

0

Ruby oneliner, FWIW:

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

Jeśli plik wejściowy jest straszne może trzeba taktykę STDIN.binmode; STDOUT.binmode; na przedniej części skryptu Ruby.

Powiązane problemy