我正在尝试将txt文件编码从UTF8转换为ANSI(cp1252)。
我需要这个,因为该文件用于固定位置Oracle导入(外部表),显然只支持CP1252。如果我导入UTF-8文件,则某些特殊字符会变为两个不正确的字符。
我在Unix机器上工作(我的操作系统是HP UX)。我一直在寻找网上的答案,但我找不到任何方法来进行这种转换。
例如,POSIX iconv
命令没有这个选择,实际上UTF8仅用作“to”编码(-t
)但从不用作“from”编码({{1 }})。 -f
返回包含转换对的长列表,但UTF8始终只在第二列中。
如何通过UNIX将我的文件转换为CP1252?
答案 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)被?