【问题标题】:How to convert Utf8 file to CP1252 by Unix如何通过 Unix 将 Utf8 文件转换为 CP1252
【发布时间】:2025-11-25 06:05:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • UTF-8 未列为“to”编码,因为您可能会丢失进入该表单的信息。
  • @ThomasDickey 你的意思是反过来吗?您会丢失从 UTF8 到 CP1252 的信息吗?
  • 是的 - 手比大脑快:-)

标签: oracle unix encoding utf-8


【解决方案1】:

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

【讨论】:

  • 投反对票有什么理由吗? Java 也可用于 Unix,大多数情况下它是默认安装的。它有效 - 我测试了它。例如 字符已正确转换。
【解决方案2】:

如果您的 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' 代替'replace' 来删除无法表示的字符。默认替换字符是?,就像上面的iconv 示例一样。

【讨论】:

    最近更新 更多