我正在处理一些 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 个字节的有效序列必须是这样的:



其中 10 是固定位, x 表示可能具有 10 值的位。

您的序列 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";
?>

10-08 10:48