我怎么知道给定的十六进制使用什么编码?
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" 部分。
我正在将应用程序从 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"
原题
从表面上看,您的编码是 utf8。但是,由于 "double encoding",该结论具有误导性。请参阅上文第二个 link 中的 "Diagnosing CHARSET issues" 部分。