Ubah penyandian file txt

16

Ketika saya menulis:

file file1.txt 

Saya memiliki output ini: Teks Unicode UTF-16 Little-endian, dengan terminator garis CR

Maka jika saya menulis:

file file2.txt 

Saya punya: teks ASCII

file2.txt dibuat dengan membuat:

echo $var > "file2.txt"

Saya ingin file2.txt memiliki penyandian yang sama dari file1.txt. Bagaimana saya bisa melakukan itu?

Pierre
sumber

Jawaban:

25

Anda dapat menggunakan iconvuntuk mengonversi penyandian file:

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

another.txt seharusnya memiliki pengkodean yang diinginkan.

Anda juga dapat mencoba ini:

echo $var | iconv -f ascii -t utf16 > "file2.txt"
Der Hochstapler
sumber
7

Gunakan ikonv:

echo "$var" | iconv --from-code=utf-8 --to-code=utf-16le --output=file2.txt
Aluísio ASG
sumber
0

Saat mengonversi file Anda, Anda harus yakin itu berisi tanda byte-order. Meskipun standar mengatakan tanda byte-order-tidak direkomendasikan untuk UTF-8 , mungkin ada kebingungan yang sah antara UTF-8 dan ASCII tanpa tanda byte-order .

Selain itu, menentukan UTF-16BEatau UTF-16LE tidak menambahkan tanda byte-order , jadi saya pertama mengonversi ke UTF-16, yang menggunakan endianness yang bergantung pada platform. Kemudian, saya gunakan fileuntuk menentukan endianness aktual dan konversi dari itu ke UTF-16LE.

Akhirnya, ketika Anda membuat file menggunakan bash, file menerima bash's locale charmapencoding, sehingga ini apa yang Anda butuhkan untuk memetakan dari.

(Saya huruf besar semua pengkodean saya karena ketika Anda mendaftar semua iconvpengkodean yang didukung dengan iconv -lmereka semua huruf besar.)

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
Perbatasan Heath
sumber
Jika Anda menurunkan ini, akankah Anda menjelaskan mengapa?
Perbatasan Heath