更改txt文件的编码


16

当我写:

file file1.txt 

我有这个输出:小尾数UTF-16 Unicode文本,带有CR行终止符

然后,如果我写:

file file2.txt 

我有: ASCII文本

file2.txt通过以下方式创建:

echo $var > "file2.txt"

我希望file2.txt具有与file1.txt相同的编码。我怎样才能做到这一点 ?

Answers:


25

您可以iconv用来转换文件的编码:

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

another.txt 然后应具有所需的编码。

您也可以尝试以下方法:

echo $var | iconv -f ascii -t utf16 > "file2.txt"

7

使用iconv:

echo "$var" | iconv --from-code=utf-8 --to-code=utf-16le --output=file2.txt

0

转换文件时,应确保文件包含字节顺序标记。即使标准说不建议对UTF-8使用字节序标记但在没有字节序标记的情况下UTF-8和ASCII之间可能存在合理的混淆

另外,指定UTF-16BEUTF-16LE 不添加字节顺序标记,因此我首先转换为UTF-16,使用平台相关的字节序。然后,我用于file确定实际的字节序并将其转换为UTF-16LE

最后,当您使用创建文件时bash,该文件将接受bashlocale charmap编码,因此您需要从中进行映射。

(我将所有编码都大写,因为当您列出所有iconv受支持的编码时,iconv -l它们都是大写的。)

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

如果您对此表示反对,可以解释原因吗?
Heath Borders
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.