我正在使用UTF8中的一些日文文本,除了非常罕见的情况外,它的工作非常好。我想在PostgreSQL DB中插入UTF8文本(也在MySQL上试过),但是我收到了这个错误:
SQLSTATE[22021]: Character not in repertoire: 7 ERREUR: invalid byte sequence for encoding "UTF8": 0xe3 0x2e 0x2e
我检查了很多方法文本,看起来是正确的UTF8(尝试使用mb_check_encoding PHP函数和自制的C)。我也尝试了很多像这样的在线转换器:http://encoder.mattiasgeniar.be/index.php
无论如何,我无法检测到哪个字符对应 0xe3 0x2e 0x2e
这是日文文本(由Facebook Graph API以UTF8给出):http://pasted.co/0eaea393
我在尝试在SQL中插入时,已经发现3个不同的文本(数千个)给出了这个错误。有问题的角色每次都是相同的: 0xe3 0x2e 0x2e
下班后,我正在请求你的帮助......
答案 0 :(得分:3)
根据UTF-8规则,3个字节的有效序列必须如下:
1110xxxx 10xxxxxx 10xxxxxx
其中1
,0
是固定位,x
表示可能具有1
或0
值的位。
你的序列0xe3 0x2e 0x2e
是二进制的:
11100011 0 0101110 0 0101110
根据上面的模式,我输入粗体的第一个0
应该是1
,以使序列有效。根据UTF-8,粗体的第二个0
也是另一个错误的数字。
所以它无效。
此外,php的mb_check_encoding()
会将其报告为无效,因此您的php检查可能是错误的。试试这个:
<?php
$bytes = pack("H*", "E32E2E");
$res = mb_check_encoding($bytes, "UTF-8");
if ($res)
echo "Valid";
else
echo "Invalid";
?>