我正在处理一些 UTF8 中的日语文本,除了非常罕见的情况外,它工作得很好。我想在 PostgreSQL 数据库中插入 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
我已经发现 3 个不同的文本(数千个)在尝试插入 SQL 时出现此错误。有问题的字符每次都一样: 0xe3 0x2e 0x2e
几个小时后,我现在请求你的帮助......
最佳答案
根据 UTF-8 规则,3 个字节的有效序列必须是这样的:
其中 1
、 0
是固定位, x
表示可能具有 1
或 0
值的位。
您的序列 0xe3 0x2e 0x2e
是二进制的:
根据上面的模式,我以粗体显示的第一个 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";
?>