字符集转换问题 - 调试无效字符 - 逆向工程早期转换
Character set conversion problem - debug invalid characters - reverse engineer earlier conversions
字符转换问题。
我有一些编码或解码不正确的字符串。
这些字符串来自 ASCII 格式的 CSV 文件。
我当前的字符串是:
N‚met
Tet‹
我知道,那个:
"‚" character (0x82) should be originally "é" (é acute accent)
"‹" character (0x8B) should be originally "ő" (o double acute accent)
如何调试和逆向工程,原始字符发生了什么转换才能得到当前字符?
我假设发生了多次解码编码,但我无法重现原始字符。
我将我的评论的扩展版本作为答案:
您的查看器使用 CP1252 (English and Western Europe, also called ANSI in Windows) or CP1250(东欧)或其他类似的代码页。大多数字符都以相同的方式编码,只有少数语言特定的变化。你的例子不包含两种编码不同的字符,所以我不能准确地说。
该代码页在 Microsoft Windows 上使用,并且它们基于(但不是 100% 兼容)Latin-1,因此经常看到使用这种编码解释的文本。 MacO 和 Linux 大量(现在)使用 UTF-8 编码。 Windows 在内部使用 Unicode(但 UTF-16)
旧编码可能是 CP437:DOS 中的标准代码页,因此它也经常用于 CSV 文件。其他常见的旧编码是 CP850(西欧)和 CP852(中欧)。
对于您在评论中提出的其他答案,我认为您应该去Superuser(如果您要求工具(某些编辑器允许您指定编码。您可以使用浏览器(打开本地文件)):浏览器还允许您选择本地编码,我认为您可以复制为 Unicode [不确定],其他工具有时会隐藏导入文件的选项,但可能不是所有选项),或者作为本网站的新问题,如果你想以编程方式进行。但是你需要指定语言。Python 非常适合这种转换(大多数脚本语言都是为处理文本而创建的):python 内置了许多编码,你应该只在读取和写入文件时指定。R 也可以在输入编码上进行指示。
我编写了自己的实用程序来帮助我诊断和修复许多棘手的编码问题。它作为开源库的一部分提供。该实用程序将任何字符串转换为 unicode 序列,反之亦然。您所要做的就是:
String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello world");
它会 return String "\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 that explains about the library and where to get it (available both on Maven central and github 的 link。在文章中搜索段落:"String Unicode converter"。
因此,当您阅读您的字符串时,将其转换并查看会出现什么。通过这种方式,您将看到那里有哪些符号,以及信息是否正确,是否只是由于某些错误的编码而失真,或者信息本身是否丢失。您可以在 Internet 上轻松找到提供任何符号到 unicode
映射表的信息
字符转换问题。 我有一些编码或解码不正确的字符串。 这些字符串来自 ASCII 格式的 CSV 文件。
我当前的字符串是:
N‚met
Tet‹
我知道,那个:
"‚" character (0x82) should be originally "é" (é acute accent)
"‹" character (0x8B) should be originally "ő" (o double acute accent)
如何调试和逆向工程,原始字符发生了什么转换才能得到当前字符?
我假设发生了多次解码编码,但我无法重现原始字符。
我将我的评论的扩展版本作为答案:
您的查看器使用 CP1252 (English and Western Europe, also called ANSI in Windows) or CP1250(东欧)或其他类似的代码页。大多数字符都以相同的方式编码,只有少数语言特定的变化。你的例子不包含两种编码不同的字符,所以我不能准确地说。
该代码页在 Microsoft Windows 上使用,并且它们基于(但不是 100% 兼容)Latin-1,因此经常看到使用这种编码解释的文本。 MacO 和 Linux 大量(现在)使用 UTF-8 编码。 Windows 在内部使用 Unicode(但 UTF-16)
旧编码可能是 CP437:DOS 中的标准代码页,因此它也经常用于 CSV 文件。其他常见的旧编码是 CP850(西欧)和 CP852(中欧)。
对于您在评论中提出的其他答案,我认为您应该去Superuser(如果您要求工具(某些编辑器允许您指定编码。您可以使用浏览器(打开本地文件)):浏览器还允许您选择本地编码,我认为您可以复制为 Unicode [不确定],其他工具有时会隐藏导入文件的选项,但可能不是所有选项),或者作为本网站的新问题,如果你想以编程方式进行。但是你需要指定语言。Python 非常适合这种转换(大多数脚本语言都是为处理文本而创建的):python 内置了许多编码,你应该只在读取和写入文件时指定。R 也可以在输入编码上进行指示。
我编写了自己的实用程序来帮助我诊断和修复许多棘手的编码问题。它作为开源库的一部分提供。该实用程序将任何字符串转换为 unicode 序列,反之亦然。您所要做的就是:
String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello world");
它会 return String "\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 that explains about the library and where to get it (available both on Maven central and github 的 link。在文章中搜索段落:"String Unicode converter"。
因此,当您阅读您的字符串时,将其转换并查看会出现什么。通过这种方式,您将看到那里有哪些符号,以及信息是否正确,是否只是由于某些错误的编码而失真,或者信息本身是否丢失。您可以在 Internet 上轻松找到提供任何符号到 unicode
映射表的信息