我有一个文本数据源,其中包括字节序列 c3 82 c2 bf。在上下文中,我认为它应该是大写的希腊 Phi 符号 (Φ)。
无论如何我无法弄清楚正在使用什么编码;我正在编写一个 Python 脚本来将此数据处理到需要 Unicode 的数据库中,并且它会在此特定数据序列上引发异常。
对于如何处理有什么建议吗?
解释为 UTF-8,c3 82 是“¡”U+00C2,c2 bf 是“¿”U+00BF,这没有多大意义,但它在技术上是有效的 UTF-8 数据,因此不应将其报告为字符级数据错误。解释为 UTF-16,它是 Hangul 音节,也可能是 CJK 表意文字,具体取决于字节顺序,但仍然是正式有效的数据,尽管很可能不是本意。
这听起来像是双重转换的结果,但很难做出有根据的猜测。如果它代表 Φ,则 UTF-16 形式为 03 A6 或 A6 03,UTF-8 形式为 CE A6,这与实际数据不太相似。有关数据来源的信息可能有助于猜测可能发生了什么转码。
这可能是
Ñ
字符的双重转换。
Ñ
UTF-8 中的字符是:0xc391
。
如果您尝试将已在 UTF-8 中编码的 Ñ
字符从
LATIN-1转换为 UTF-8,您将得到:
0xc382c2bf
。
为什么?
0xc382
是 UTF-8 翻译自 LATIN-1 0xc3
字符 Ã
(带有波形符的 A)0xc2bf
是 ¿
字符,这是当您无法从 LATIN-1 转换字符时得到的字符(0x91
是 LATIN-1FWIW,我最终得到了来自
c3 82 c2 bf
的
。我没有深入研究转换,因为我可以简单地扔掉那部分代码。可以说
位于由 wordpress (php) 插件处理的 html 电子邮件模板中。
我不知道原因。但也许有一种可能的情况。
二进制 x0xx 转换为 0xC2 x0xx
二进制 x1xx 转换为 0xC3 x0xx
所以添加了很多c2和c3。
这发生在哪里?在 url 查询字符串中发送非 ascii 进行 ajax 调用,Flask 服务器将执行此操作。
这与 ¿ 字符从 UTF-8 到 IS0-8859-1 的双重转换一致。
这是一个 bash 交互演示了这一点。请注意,我的 bash 控制台本身使用 UTF-8 编码(如前两个命令所示)。
$ echo $LC_ALL
en_US.UTF-8
$ echo -n '¿' | hexdump -C
00000000 c2 bf |..|
00000002
$ echo -n '¿' | iconv -f iso-8859-1 -t utf-8 | hexdump -C
00000000 c3 82 c2 bf |....|
00000004
其他常见的非 ASCII 字符也有类似的变体,例如:
$ echo -n 'í' | hexdump -C
00000000 c3 ad |..|
00000002
$ echo -n 'í' | iconv -f iso-8859-1 -t utf-8 | hexdump -C
00000000 c3 83 c2 ad |....|
00000004
我使用 $str = mb_convert_encoding($content, "UTF-8" , "UTF-16LE"); 转换为 utf-8 后从外部 utf-16 文档收到了这个字符 \xc3\x82; (PHP)
原始序列是 0xA0 0x00,转换器将其转换为 NBSP 的含义。它是货币数字中千位分隔符处的字符。 nbsp 是 \xc2\xa0 所以现在我有数千个删除:
$price = str_replace(["\xc2\xa0","\xc3\x82"], '', $price);