我有一个应用程序允许用户将字符串保存到数据库中,这些字符串可能包含表情符号。我遇到的问题是诸如 😊
之类的表情符号将作为 ðŸ∼Š
当我使用 PHP MySQL 客户端检索此字符串并在 Web 浏览器中呈现它时,它呈现良好可能是因为 Content-Type
设置为 UTF-8。当我尝试读取 node.js 中的字符串时,我得到了我认为是 ISO8859-1 编码的文字 ðŸ∼Š
。表上的字符集设置为 latin1
,这就是我从中获取 ISO8859-1 的地方。
在 node.js 中对字符串进行编码的正确方法是什么,以便在我 console.log
字符串时可以看到表情符号而不是 MySQL 设置的编码?
最佳答案
ðŸ∼Š
是 Mojibake对于😊
。将前者解释为 latin1,您将得到十六进制 F09F988A
,这是该表情符号的 UTF-8
十六进制。
(注意:MySQL 外的 UTF-8
等同于 MySQL 内的 utf8mb4
。)
在 MySQL 中,您必须使用 CHARACTER SET utf8mb4
声明列/表。您还必须声明正在存储/获取的数据编码为 utf8mb4
。注意:utf8
是不够的。
做一个 SELECT HEX(col) FROM ...
看看你是否得到那个表情符号的十六进制。如果是这种情况并且列当前是latin1
,那么部分修复是小心地将列转换为utf8mb4。也就是说,您有 CHARACTER SET latin1
,但其中有 UTF-8 字节;这将在修复字符集时单独保留字节。假设该列已经是 VARCHAR(111) CHARACTER SET latin1 NOT NULL
,然后执行以下两步 ALTER:
ALTER TABLE tbl MODIFY COLUMN col VARBINARY(111) NOT NULL;
ALTER TABLE tbl MODIFY COLUMN col VARCHAR(111) CHARACTER SET utf8mb4 NOT NULL;
几乎任何其他转换机制都会造成更糟的情况。
至于正确建立连接,对于 node.js 来说是这样的:
var connection = mysql.createConnection({ ... , charset : 'utf8mb4'});
关于mysql - Node.js 将 ISO8859-1 编码为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43107108/