Khi chuyển đổi tệp của bạn, bạn nên chắc chắn rằng nó chứa dấu thứ tự byte. Mặc du tiêu chuẩn nói rằng dấu thứ tự byte không được khuyến nghị cho UTF-8 , có thể có sự nhầm lẫn hợp pháp giữa UTF-8 và ASCII mà không có dấu thứ tự byte .
Ngoài ra, chỉ định UTF-16BE
hoặc là UTF-16LE
không trả trước một dấu thứ tự byte , vì vậy trước tiên tôi chuyển đổi sang UTF-16
, trong đó sử dụng một endianness phụ thuộc nền tảng. Sau đó, tôi sử dụng file
để xác định tuổi thọ thực tế và chuyển đổi từ đó sang UTF-16LE
.
Cuối cùng, khi bạn tạo một tệp bằng cách sử dụng bash
, tập tin nhận được bash
'S locale charmap
mã hóa, vì vậy đó là những gì bạn cần ánh xạ từ.
(Tôi viết hoa tất cả các mã hóa của tôi bởi vì khi bạn liệt kê tất cả iconv
mã hóa được hỗ trợ với iconv -l
chúng đều là chữ hoa.)
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