使用 UTF-8 和 mb_substr 的损坏数据

Corrupted data using UTF-8 and mb_substr

我从 MySQL db,varchar(255) utf8_general_ci 字段获取数据,并尝试使用 PHP 将文本写入 PDF。我需要确定 PDF 中的字符串长度以限制 table 中文本的输出。但是我注意到 mb_substr/substr 的输出真的很奇怪。

例如:

mb_internal_encoding("UTF-8");

$_tmpStr = $vfrow['title'];
$_tmpStrLen = mb_strlen($vfrow['title']);
for($i=$_tmpStrLen; $i >= 0; $i--){
     file_put_contents('cutoffattributes.txt',$vfrow['field']." ".$_tmpStr."\n",FILE_APPEND);
     file_put_contents('cutoffattributes.txt',$vfrow['field']." ".mb_substr($_tmpStr, 0, $i)."\n",FILE_APPEND);
}

输出这个:

npp file link

数据库:

我的问题是多余的字符是从哪里来的?

除了 table 和字段设置为 UTF-8 之外,您还需要将 mysqli_set_charset('UTF-8') 设置为 UTF-8(如果您使用的是 mysqli)。

你也试了吗?

$_tmpStr = utf8_encode( $vfrow['title'] ); 

额外的字符是两字节 UTF-8 序列的第一部分。您可能对多字节字符串函数的内部编码有问题。您的代码将文本视为固定的 1 字节编码。 UTF-8 中的 ń,十六进制 C5 84,在 CP-1250 中被视为 Ĺ„Ĺ[IND] 在 ISO-8859-2 中,两个字符。

尝试在脚本顶部执行这个:

mb_internal_encoding("UTF-8");

http://php.net/manual/en/function.mb-internal-encoding.php

  1. 您需要通过适当设置连接编码来确保您确实以 UTF-8 编码从数据库中获取数据。这取决于您的数据库适配器,有关详细信息,请参阅 UTF-8 all the way through
  2. 您需要告诉您的 mb_ 函数数据采用 UTF-8 格式,以便它们可以正确处理。使用 mb_internal_encoding 为所有函数全局设置此项,或者在调用函数时将 $encoding 参数传递给您的函数:

    mb_substr($_tmpStr, 0, $i, 'UTF-8')