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)替换为?
我正在尝试将 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)替换为?