ran*_*its 7 mysql unicode utf-8 iso-8859-1 node.js
我有一个应用程序,允许用户将字符串持久化到数据库,这些字符串可能包含表情符号.我遇到的问题是表情符号,例如 will get stored in MySQL as 😊
当我使用PHP MySQL客户端检索此字符串并在Web浏览器中呈现它时,它可能因为Content-Type设置为UTF-8 而呈现得很好.当我尝试读取node.js中的字符串时,我回想起我认为ISO8859-1编码的文字😊.桌子上的字符集设置为latin1,这就是我从中获取ISO8859-1的地方.
在node.js中对字符串进行编码的正确方法是什么,以便在字符串中我可以看到表情符号而不是MySQL设置的编码console.log?
Ric*_*mes 12
😊是变为乱码了. Interpreting the former as latin1, you get hex F09F988A,这是该UTF-8表情符号的十六进制.
(注意: UTF-8MySQL之外的内容相当于utf8mb4MySQL内部.)
在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 TABLE tbl MODIFY COLUMN col VARBINARY(111) NOT NULL;
ALTER TABLE tbl MODIFY COLUMN col VARCHAR(111) CHARACTER SET utf8mb4 NOT NULL;
Run Code Online (Sandbox Code Playgroud)
事实上,任何其他转换机制都会造成更糟糕的混乱.
至于正确建立连接,它对于node.js来说是这样的:
var connection = mysql.createConnection({ ... , charset : 'utf8mb4'});
Run Code Online (Sandbox Code Playgroud)
我找到了一种超级肮脏的方法将其转换回来:
\n\n const isoToUtfTable = {\r\n \'\xc3\xb0\': 0xf0,\r\n \'\xc5\xb8\': 0x9f,\r\n \'\xcb\x9c\': 0x98,\r\n \'\xc5\xa0\': 0x8a\r\n };\r\n \r\n function convertISO8859ToUtf8(s) {\r\n const buf = new Uint8Array([...s].map(c => isoToUtfTable[c]));\r\n return String.fromCharCode(...buf)\r\n }\r\n \r\n function decode_utf8(s) {\r\n return decodeURIComponent(escape(s));\r\n }\r\n \r\n console.log(decode_utf8(convertISO8859ToUtf8(\'\xc3\xb0\xc5\xb8\xcb\x9c\xc5\xa0\')))Run Code Online (Sandbox Code Playgroud)\r\n现在您只需完成该isoToUtfTable表(它很小,请参阅https://en.wikipedia.org/wiki/ISO/IEC_8859-1)。
| 归档时间: |
|
| 查看次数: |
2612 次 |
| 最近记录: |