当前位置: 首页 > 知识库问答 >
问题:

从双UTF-8到UTF-8(或从UTF-8到ANSI)的“原始”转换

夹谷茂
2023-03-14

我正在处理一个使用UTF-8编码了两次的遗留文件。例如,编码点εu03b5)本应编码为ceb5,但改为编码为c38ec2b5ce8eu00ce的UTF-8编码,c2b5u00b5的UTF-8编码)。

假设数据在CP-1252中编码,则执行第二次编码。

为了回到UTF-8编码,我使用了以下(似乎错误)命令

iconv --from utf8 --to cp1252 <file.double-utf8 >file.utf8

我的问题是iconv似乎无法转换回一些字符。更准确地说,iconv无法转换UTF-8表示形式包含映射到CP-1252中控制字符的字符。一个例子是代码点ρ(u03c1):

  • 它的UTF-8编码是CF 81
  • 第一个字节CF被重新编码为C3 8F
  • 第二个字节81被重新编码为C2 81

iconv拒绝将C2 81转换回81,可能是因为它不知道如何精确映射该控制字符。

echo -e -n '\xc3\x8f\xc2\x81' | iconv --from utf8 --to cp1252
�iconv: illegal input sequence at position 2

我如何告诉iconv只执行数学UTF-8转换而不关心映射?

共有2个答案

吕晟睿
2023-03-14

下面的代码使用Ruby的低级编码函数强制将双编码UTF-8(来自CP1525)重写为普通UTF-8。

#!/usr/bin/env ruby

ec = Encoding::Converter.new(Encoding::UTF_8, Encoding::CP1252)

prev_b = nil

orig_bytes = STDIN.read.force_encoding(Encoding::BINARY).bytes.to_a
real_utf8_bytes = ""
real_utf8_bytes.force_encoding(Encoding::BINARY)

orig_bytes.each_with_index do |b, i|
    b = b.chr

    situation = ec.primitive_convert(b.dup, real_utf8_bytes, nil, nil, Encoding::Converter::PARTIAL_INPUT)

    if situation == :undefined_conversion
            if prev_b != "\xC2"
                    $stderr.puts "ERROR found byte #{b.dump} in stream (prev #{(prev_b||'').dump})"
                    exit
            end

            real_utf8_bytes.force_encoding(Encoding::BINARY)
            real_utf8_bytes << b
            real_utf8_bytes.force_encoding(Encoding::CP1252)
    end

    prev_b = b
end

real_utf8_bytes.force_encoding(Encoding::BINARY)
puts real_utf8_bytes

它用于管道中:

cat $PROBLEMATIC_FILE | ./fix-double-utf8-encoding.rb > $CORRECTED_FILE
饶承宣
2023-03-14
echo -e -n '\xc3\x8f\xc2\x81' | iconv --from utf8 --to iso8859-1

Windows-1252在0x80-0x9F范围内与ISO-8859-1不同。例如,在您的例子中,0x81在ISO 8859-1中是U 0081,但在Windows-1252中无效。

检查您的其余数据是否被误解为Windows-1252或ISO 8859-1。通常,ISO 8859-1更为常见。

 类似资料:
  • 我有一些用ANSI编码的php脚本文件。现在我已经将我的网站转换为html5,我需要UTF-8中的所有内容,以便这些文件中的重音可以正确显示,而无需通过iconv()进行任何php转换。我使用记事本++在UTF-8上设置脚本编码并保存文件,大多数都很好,重音显示正确,只有主脚本现在阻止了一切,服务器只返回一个白页,没有任何错误消息,即使使用! 当我在记事本++中将编码更改为ANSI并保存文件而不做

  • 我试图保存一个字符串在希伯来文文件,同时有文件ANSI编码。恐怕所有的尝试都失败了。 PHP文件本身是UTF-8 这是我正在尝试的代码: 由于某种原因,返回false。 另一次尝试是: 这返回一个空字符串。当这不起作用时,将输出字符集更改为Windows-1255的工作。所以函数本身工作,但由于某种原因,它不转换为1252。 我运行这个函数之前和之后的和打印的结果 在图标之前编码是UTF-8,在图

  • 嗨,我试图使我在UTF-8兼容的应用程序之一。我的环境如下:linux操作系统,apahce网络服务器作为超文本传输协议监听器,tomcat作为servlet引擎 配置了mod_jk和tomcat的apache s使用ajp连接器。 我已经从少数网站上阅读了UTF-8的基本指南,并根据建议尝试了以下方法 为服务器中的连接器设置和。xml 设置语言bashrc/. file使用 将apache服务器

  • 一个处理UTF-8编码字符串的简单、小巧、跨平台的泛型库。

  • 本文向大家介绍Java gbk转utf-8,包括了Java gbk转utf-8的使用技巧和注意事项,需要的朋友参考一下 1、文件转码:使用脚本 gbk转utf-8的脚本文件: 2、文件转码后,本地环境改成utf-8环境,可能会有部分乱码文件,手动修复 3、含有中文js引用增加charset="gbk"    如依赖:static.360buying.com、shop.jd.com 4、打包编译编码

  • 问题内容: 我正在设置一个新服务器,并希望在我的Web应用程序中完全支持UTF-8。我过去曾在现有服务器上尝试过此操作,但最终似乎总是不得不退回到ISO-8859-1。 我到底需要在哪里设置编码/字符集?我知道我需要配置Apache,MySQL和PHP来执行此操作- 是否可以遵循一些标准清单,或者对出现不匹配的地方进行故障排除? 这是用于运行Linux 5,PHP,5和Apache 2的新Linu