更改txt文件的编码

更改txt文件的编码

当我写:

file file1.txt 

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

然后如果我写:

file file2.txt 

我有 : ASCII 文本

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

echo $var > "file2.txt"

我希望 file2.txt 与 file1.txt 具有相同的编码。我该怎么做?

答案1

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

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

another.txt就应该具有所需的编码。

你也可以尝试这个:

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

答案2

使用 iconv:

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

答案3

转换文件时,应确保文件包含字节顺序标记。即使标准规定不建议对 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

相关内容