Zmień kodowanie pliku txt

16

Kiedy piszę:

file file1.txt 

Mam ten wynik: tekst Unicode Little-endian UTF-16 z terminatorami linii CR

Więc jeśli napiszę:

file file2.txt 

Mam: tekst ASCII

plik2.txt jest tworzony przez:

echo $var > "file2.txt"

Chciałbym, żeby plik2.txt miał takie samo kodowanie jak plik1.txt. Jak mogę to zrobić ?

Pierre
źródło

Odpowiedzi:

25

Możesz użyć iconvdo konwersji kodowania pliku:

iconv -f ascii -t utf16 file2.txt > another.txt

another.txt powinien mieć wtedy pożądane kodowanie.

Możesz także spróbować tego:

echo $var | iconv -f ascii -t utf16 > "file2.txt"
Der Hochstapler
źródło
7

Użyj iconv:

echo "$var" | iconv --from-code=utf-8 --to-code=utf-16le --output=file2.txt
Aluísio ASG
źródło
0

Podczas konwertowania pliku należy upewnić się, że zawiera on znak kolejności bajtów. Chociaż standard mówi, że znak kolejności bajtów nie jest zalecany dla UTF-8 , mogą istnieć uzasadnione pomyłki między UTF-8 a ASCII bez znaku kolejności bajtów .

Dodatkowo, określając UTF-16BElub UTF-16LE nie dodając znaku kolejności bajtów , więc najpierw UTF-16dokonuję konwersji na , która wykorzystuje zależność od platformy. Następnie używam filedo określenia rzeczywistego endianizmu i konwersji z tego na UTF-16LE.

Wreszcie, podczas tworzenia pliku przy użyciu bashplik otrzymuje bash„s locale charmapkodowanie, więc to, co trzeba mapować.

(Wszystkie moje kodowania wielkimi literami, ponieważ kiedy wyświetlasz listę wszystkich iconvobsługiwanych kodowań iconv -l, wszystkie są wielkie).

BASH_ENCODING="$( locale charmap | tr [:lower:] [:upper:] )"
echo $var | iconv -f "$BASH_ENCODING" -t UTF-16 > UTF-16-UNKNOWN-ENDIANNESS-FILE
FILE_ENCODING="$( file --brief --mime-encoding UTF-16-UNKNOWN-ENDIANNESS-FILE )"
iconv -f "$FILE_ENCODING" -t UTF-16LE UTF-16-UNKNOWN-ENDIANNESS-FILE > file2.txt
Granice zdrowia
źródło
Jeśli zlekceważysz to, czy wyjaśnisz dlaczego?
Heath Borders