如何通过Unix将Utf8文件转换为CP1252

时间:2015-03-24 11:21:47

标签: oracle unix encoding utf-8

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

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

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

例如,POSIX iconv命令没有这个选择,实际上UTF8仅用作“to”编码(-t)但从不用作“from”编码({{1 }})。 -f返回包含转换对的长列表,但UTF8始终只在第二列中。

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

2 个答案:

答案 0 :(得分:1)

如果您的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缺少一些这些选项。如果您没有在平台上获得iconv所需的行为,可以查看recode和/或编写您自己的简单转换工具。

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

'ignore&#39;而不是'replace'删除无法表示的字符。默认替换字符为?,如上面iconv示例中所示。

答案 1 :(得分:0)

看看这个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)被?

取代