关于oracle:如何通过Unix将Utf8文件转换为CP1252

How to convert Utf8 file to CP1252 by Unix

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

我需要这样做是因为该文件在固定位置的Oracle导入(外部表)中使用,该导入显然仅支持CP1252。 如果导入UTF-8文件,则某些特殊字符会变成两个不正确的字符。

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

例如,POSIX iconv命令没有此选择,实际上UTF8仅用作"至"编码(-t),而从未用作"起始"编码(-f)。 iconv -l返回带有转换对的长列表,但UTF8始终仅在第二列中。

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


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

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

但是,如果UTF-8文本包含一些不能用CP1252表示的字符,则有两种选择:

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

这应该是一个有意识的选择,因此,开箱即用iconv不允许您执行此操作;但是有启用此行为的选项。在第一个行为中查看-c选项,在第二个行为中查看--unicode-subst

1
2
3
4
5
6
7
8
9
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缺少其中一些选项。如果您在平台上的iconv中没有得到所需的行为,也许看一下recode和/或编写自己的简单转换工具。

1
2
3
4
#!/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安装的一部分。

转换分为两个步骤:

1
2
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)被替换为?