我怎么知道给定的十六进制使用什么编码?

How I can know what encoding is used for a given hex?

我正在将应用程序从 rails 2.3 升级到 rails 5。我们遇到的一个问题是 db 上的编码,我们正在使用 mysql。

在 rails 2.3 应用程序中,如果您为我们的字段查询数据库,您将获得有效符号,例如:

如果直接查看数据库:

€

检查十六进制表示

select HEX(txt) from table;
+----------------+
| HEX(txt)       |
+----------------+
| C3A2E2809AC2AC |
+----------------+
1 row in set (0.00 sec)

如果我在应用程序的 rails 5 版本上保存完全相同的字符,当直接查询数据库时,我在数据库上得到了正确的值。

对于十六进制的长度,我认为它是 utf-16 但不是:

SELECT CHAR(0xC3A2E2809AC2AC USING utf16);
+-----------------------------------+
| CHAR(0xC3A2E2809AC2AC USING utf16) |
+-----------------------------------+
| 肚슬                              |
+-----------------------------------+
1 row in set (0.00 sec)

现在,如果我知道 0xC3A2E2809AC2AC 代表一个 €,就可以知道该表示在哪个字符集中是准确的吗?

我认为 mysql 适配器 mysql (2.8.1) 正在做一些转换,但我找不到任何关于此的文档。

字段排序规则为utf8_general_ci,数据库字符集为utf8

要将其转换为 utf 8,导出并导入 table,像这样

mysqldump -u db_user -p --opt --default-character-set=latin1 --skip-set-charset db_name db_table > some_file.sql

观察 --skip-set-charset 选项以强制它不将任何字符集放入转储中。

然后我用

导入它
mysql -u db_user -p --default-character-set=utf8 db_name < some_file.sql

不,这不是欧元符号的正确编码,至少不是直接编码。

被视为 utf8,C3A2 E2809A C2AC(添加的间距)是 €。但是撤消 "double encoding" (即通过 latin1 转换两次),你会得到 :

CONVERT(BINARY(CONVERT(CONVERT(UNHEX('C3A2E2809AC2AC')
                       USING utf8mb4)
               USING latin1))
USING utf8mb4) --> '€'

(在这种情况下,utf8 和 utf8mb4 将产生相同的结果。)

如需更多讨论,请在中搜索 "double" Here。两者都为系统和数据提供了可能的修复。

原题

从表面上看,您的编码是 utf8。但是,由于 "double encoding",该结论具有误导性。请参阅上文第二个 link 中的 "Diagnosing CHARSET issues" 部分。