substr() 外来字符给我带有白色问号的黑色菱形

Tod*_*enk 3 html php unicode utf-8 character-encoding

我正在从数据库中获取外语(日语)字符并使用 substr() 来限制字符串的长度。

\n\n

但是,当我这样做时,它会从字符串中切掉一个字符,并留下黑色菱形中的问号之一作为替换字符(\xef\xbf\xbd)

\n\n

所有内容(文档、字符集、表编码)均设置为 UTF-8。

\n\n

这是发生的情况的示例

\n\n
$string = "\xe6\x97\xa5\xe6\x9c\xac\xe6\x9c\x80\xe5\xa4\xa7\xe7\xb4\x9a\xe3\x81\xae\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\x82\xb5\xe3\x82\xa4\xe3\x83\x88\xe3\x80\x82"\necho substr($string, 0,10); \n
Run Code Online (Sandbox Code Playgroud)\n\n

输出 \xe6\x97\xa5\xe6\x9c\xac\xe6\x9c\x80\xef\xbf\xbd

\n\n

您建议我如何查找/替换此问号图标?

\n

Alm*_* Do 5

处理 UTF-strigs 时不能使用substr(),因为每个符号将表示为多个字节,而不是单个字节(对于非 ASCII 字符)。并substr()适用于bytes。相反,您应该使用mb_substr()它将安全且正确地返回所需结果的方法。

为了在 PHP 中处理多字节字符串,有一个mbstring扩展,并且mb_substr()是它的一部分。