Unix 如何将 Utf8 文件转换为 CP1252

How to convert Utf8 file to CP1252 by Unix

我正在尝试将 txt 文件编码从 UTF8 转换为 ANSI (cp1252)。

我需要这个,因为该文件用于固定位置的 Oracle 导入(外部 Table),显然只支持 CP1252。如果我导入一个 UTF-8 文件,一些特殊字符会变成两个不正确的字符。

我在 Unix 机器上工作(我的 OS 是 HP UX)。我一直在网上寻找答案,但我找不到任何方法来进行这种转换。

例如POSIX iconv命令没有这个选项,实际上UTF8只是用作"to"编码(-t)但是从不作为 "from" 编码 (-f)。 iconv -l returns 包含转换对的长列表,但 UTF8 始终仅在第二列。

如何通过 UNIX 将我的文件转换为 CP1252?

如果您的 UTF-8 文件仅包含也可表示为 CP1252 的字符,您应该能够执行转换。

iconv -f utf-8 -t cp1252 <file.utf8 >file.txt

但是,如果 UTF-8 文本包含一些不能表示为 CP1252 的字符,您有几个选择:

  • 仍然转换,并让转换器忽略有问题的字符
  • 仍然转换,并让转换器替换有问题的字符

这应该是一个有意识的选择,所以开箱即用,iconv不允许你这样做;但是有一些选项可以启用此行为。查看第一个行为的 -c 选项,第二个行为的 --unicode-subst

bash$ echo 'x≠y' | iconv -f utf-8 -t cp1252
x
iconv: (stdin):1:1: cannot convert

bash$ echo 'x≠y' | iconv -f utf-8 -t cp1252 -c
xy

bash$ echo 'x≠y' | iconv -f utf-8 -t cp1252 --unicode-subst='?'
x?y

这是在 OS X 上;显然,Linux iconv 缺少其中一些选项。也许看看 recode and/or 如果你没有从你的平台上的 iconv 中获得你需要的行为,请编写你自己的简单转换工具。

#!/usr/bin/env python
import sys
for line in sys.stdin:
    print(line.decode('utf-8').encode('cp1252', 'replace'))

'ignore'代替'replace'来丢弃无法表示的字符。默认替换字符是 ?,如上面的 iconv 示例。

看看这个 Java 转换器:native2ascii 它是 JDK 安装的一部分。

转换分两步完成:

native2ascii -encoding UTF-8 <your_file.txt> <your_file.txt.ascii>
native2ascii -reverse -encoding windows-1252 <your_file.txt.ascii> <your_file_new.txt>

UTF-8使用但CP1252不支持的字符(包括BOM)替换为?