当我写:
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-16BE
或UTF-16LE
不添加字节顺序标记,因此我首先将其转换为UTF-16
,它使用与平台相关的字节序。然后,我使用file
来确定实际的字节序,并将其转换为UTF-16LE
。
最后,当您使用 创建文件时bash
,该文件将接收bash
的locale 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