gpt4 book ai didi

php - Mysql HEX函数解码多字节utf8

转载 作者:行者123 更新时间:2023-11-29 02:32:08 25 4
gpt4 key购买 nike

MySQL 使用函数 HEX() 将字符序列转换为十六进制表示。唯一的问题是它假定每个字符都是两个字节。这在大多数情况下都很好,但使用 utf-8 有时会出现跨越 2 个字节以上的字符。

例如。 0xEFBFBD 是用于表示编码错误的三字节字符。当我在数据库(总共 6 个字节)的 utf8 编码表中一个接一个地拥有这些字符中的两个时,我尝试 SELECT HEX(col1) FROM table ...,结果为 0xC3AFC2BFC2BD 而不是 0xEFBFBD。如果我在 php 中使用查询选择它,然后在 php 中将其转换为十六进制,它就会以正确的格式出现。

最好的功能是 MySql,它可以正确解码多字节 UTF8。我很惊讶它似乎不存在,并且想知道是否有其他人也发现了这种情况以及可能的解决方法。

我在 MySql 中找到的最接近答案的是: http://forums.mysql.com/read.php?103,375304,375660

但是这个建议并没有真正的帮助。如果没有人有任何想法,我稍后会发布一个测试用例。

最佳答案

HEX函数返回实际存储的字节;请记住,MySQL 乐于存储混合字符编码。如果您为每个字符获取两个字节,则您的值必须编码为 ucs2 or utf16 .要检查编码,您可以使用 CHARSET function .

在这种特殊情况下,该列似乎包含以 UTF-16 编码的 쎯슿슽 (U+C3AF U+C2BF U+C2BD)。一定有其他问题让您相信 �� (U+FFFD U+FFFD) 是存储值。也许您的 PHP 程序正在使用 ucs2utf16 作为连接字符集,然后将获取的文本视为 UTF-8?


更新:要获取字符串的 UTF-8 编码的十六进制表示形式 -- 任何字符串,任何编码*) --,请使用 HEX(CONVERT(string USING utf8 ))。例如:

set @unknown = char(0xFFFD using ucs2);        -- stored bytes: \xFF \xFD
select hex(convert(@unknown using utf8)); -- output: EFBFBD

*) 除了没有编码可转换的二进制字符串

关于php - Mysql HEX函数解码多字节utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11489444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com