我真的不知道为什么在西里尔字体上,子字符串用“?”替换一些字符
我的代码
$string1 = get_the_content();
$string = strip_tags($string1);
$stringcutted = substr($string,0,150);
$replacement = "...";
$final = substr($stringcutted, 0, -3).$replacement;
看看它是如何在 html 上呈现的
有什么解决办法吗?
因为 PHP 的字符串函数是基于字节串的;他们对字符编码一无所知。所以在 UTF-8 之类的东西中,一个字符可以占用一个以上的字节,它不能按照你想要的方式工作:
<?php
$x = 'Подмосковные вечера';
print(strlen($x)."\n"); # 37, not 19
print(substr($x,0,1)."\n"); # �, not П
print(substr($x,0,2)."\n"); # П, not По
?>
如果要操作非 ASCII 文本,请查看多字节字符串函数。
您需要检查字符编码。基本上,您有一个以一种格式编码的字符串,并且您正在以另一种格式输出它。
对于国际内容(看起来您正在这样做),那么我将使用 UTF-8:-在您的 HTML 文件中添加头部(靠近顶部)-在您的 PHP 中,确保您将所有字符串处理为UTF-8 - 如果您还有一个数据库,请确保数据库、表和字段都配置为 UTF-8(警告:进行此更改可能会在没有导入/导出的情况下损坏现有数据!)。- 如果您正在阅读带有特殊字符的模板文件,还要确保它们是 UTF-8。(如果没有特殊字符,那么普通的 AscII 就可以了)
这就是简单的答案。有很多关于字符编码的内容 - 只需谷歌一下。
(替代解决方案,使用 ASCII,但将所有内容都转换为网络友好的字符代码。但是要正确获取所有代码更棘手,尤其是在处理用户输入时。)
您必须手动定义字符集。使用 mb_substr()。它应该有帮助。 http://php.net/manual/en/function.mb-substr.php