【问题标题】:Character set conversion problem - debug invalid characters - reverse engineer earlier conversions字符集转换问题 - 调试无效字符 - 逆向工程早期的转换
【发布时间】:2019-01-19 15:31:30
【问题描述】:

字符转换问题。 我有一些编码或解码不正确的字符串。 字符串以 ASCII 格式的 CSV 文件出现。

我目前拥有的字符串是:

N‚met
Tet‹

我知道:

"‚" character (0x82) should be originally "é" (é acute accent)
"‹" character (0x8B) should be originally "ő" (o double acute accent)

如何调试和逆向工程,原始字符发生了哪些转换以获得当前字符?

我想发生了多次解码编码,但我无法重现原始字符。

【问题讨论】:

  • 您的查看器使用了 1252 (en.wikipedia.org/wiki/Windows-1252),而您的原始输入使用了一些其他编码,可能基于 DOS 437:en.wikipedia.org/wiki/Code_page_437 您可以查看页面上的 CP (en.wikipedia.org/wiki/Character_encoding):最常见的。也许是 852(中欧)。
  • @GiacomoCatenazzi:你是对的。请张贴作为答案,我会接受的。我用以下站点进行了测试:string-functions.com/encodedecode.aspx 输入:“ő”,选择 IBM852 作为 Encode,选择 Windows-1252。结果将是:“‹”。输入:“é”,选择IBM852作为Encode,选择Windows-1252。结果将是:“,”。非常感谢!
  • @GiacomoCatenazzi:但是我无法将结果从“,”反转为“é”。有可能吗?
  • @GiacomoCatenazzi:简单来说就是DOS CP852代码页文本,在Windows环境下显示,Windows-1252编码。请将此作为答案发布,我将接受它作为解决方案。

标签: debugging character-encoding char non-ascii-characters file-conversion


【解决方案1】:

我将我的评论的扩展版本作为答案:

您的查看器使用CP1252(英语和西欧,在Windows 中也称为ANSI)或CP1250(东欧)或其他类似的代码页。大多数字符都以相同的方式编码,只有很少的语言特定更改。您的示例不包含两种编码不同的字符,所以我不能准确地说。

该代码页用于 Microsoft Windows,它们基于(但不是 100% 兼容)Latin-1,因此通常会看到使用这种编码解释的文本。 MacO 和 Linux 大量(现在)采用 UTF-8 编码。 Windows 内部使用 Unicode(但 UTF-16)

旧的编码可能是 CP437:DOS 中的标准代码页,因此它也经常用于 CSV 文件。其他常见的旧编码是 CP850(西欧)和 CP852(中欧)。

对于您在 cmets 中输入的其他答案,我认为您应该转到超级用户(如果您正在请求工具(某些编辑器允许您指定编码。您可以使用浏览器(打开本地文件):浏览器也允许您选择本地编码,我认为您可以复制为 Unicode [不确定],其他工具有时会隐藏导入文件的选项,但可能不是所有选项),或者作为本网站中的新问题,如果您愿意以编程方式进行。但是因此您需要指定语言。Python 非常适合这种转换(大多数脚本语言都是为处理文本而创建的):python 内置了许多编码,您应该只指定何时读取和写入文件。R也可以指示输入编码。

【讨论】:

  • 谢谢!您的指导帮助了我,所以我接受这个答案作为解决方案。
【解决方案2】:

我编写了自己的实用程序来帮助我诊断和修复许多棘手的编码问题。它作为开源库的一部分提供。该实用程序将任何字符串转换为 unicode 序列,反之亦然。您所要做的就是:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello world");

它会返回字符串"\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"

这同样适用于任何语言的任何字符串,包括特殊字符。这是文章Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison 的链接,该文章解释了该库以及从何处获取它(在Maven centralgithub 上均可用。在文章中搜索段落:“字符串Unicode 转换器”.

因此,当您阅读您的字符串时,请转换它,看看会发生什么。通过这种方式,您将看到那里有哪些符号,以及信息是否正确并且仅因某些错误的编码而失真,或者信息本身是否丢失。您可以在 Internet 上轻松找到提供任何符号到 unicode 的映射表的信息

【讨论】:

  • 这似乎不是问题的答案。您是否要求问题作者运行该工具以向问题添加更多信息?
  • 不完全是。我提供了一个工具,如果运行可能会掩盖问题并澄清数据是否存在但只是显示不正确或数据本身已损坏/丢失。因此,该工具旨在诊断问题。它帮助了我无数次。但 OP 可能会运行该工具并提供结果,然后我或其他人可以帮助他继续分析问题
  • 当然,但作为不回答,最好作为评论和/或在标签维基中列出。
  • @Tom - 我理解你的观点但不同意:问题的内容没有足够的信息来给出明确的答案。我的回答提供了一种获取该信息的方法,并且也很有可能解决它。所以我觉得留下来作为答案是有道理的。但这当然是我的意见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2018-05-17
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多