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

时间:2015-04-22 16:08:02

标签: php utf-8 mbstring

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

例如:

substr

输出:

screen shot from npp

the manual

数据库:

enter image description here enter image description here

我的问题是额外角色来自哪里?

3 个答案:

答案 0 :(得分:1)

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

尝试在脚本顶部执行此操作:

mb_internal_encoding("UTF-8");

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

你也试过吗?

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