使用 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);
}
输出这个:
数据库:
我的问题是多余的字符是从哪里来的?
除了 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");
- 您需要通过适当设置连接编码来确保您确实以 UTF-8 编码从数据库中获取数据。这取决于您的数据库适配器,有关详细信息,请参阅 UTF-8 all the way through。
您需要告诉您的 mb_
函数数据采用 UTF-8 格式,以便它们可以正确处理。使用 mb_internal_encoding
为所有函数全局设置此项,或者在调用函数时将 $encoding
参数传递给您的函数:
mb_substr($_tmpStr, 0, $i, 'UTF-8')
我从 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);
}
输出这个:
数据库:
我的问题是多余的字符是从哪里来的?
除了 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");
- 您需要通过适当设置连接编码来确保您确实以 UTF-8 编码从数据库中获取数据。这取决于您的数据库适配器,有关详细信息,请参阅 UTF-8 all the way through。
您需要告诉您的
mb_
函数数据采用 UTF-8 格式,以便它们可以正确处理。使用mb_internal_encoding
为所有函数全局设置此项,或者在调用函数时将$encoding
参数传递给您的函数:mb_substr($_tmpStr, 0, $i, 'UTF-8')