6

我真的不知道为什么在西里尔字体上,子字符串用“?”替换一些字符

我的代码

$string1 = get_the_content();
$string = strip_tags($string1);
$stringcutted = substr($string,0,150);
$replacement = "...";
$final = substr($stringcutted, 0, -3).$replacement;

看看它是如何在 html 上呈现的

奇怪的图标1 奇怪的图标2

有什么解决办法吗?

4

3 回答 3

3

因为 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 文本,请查看多字节字符串函数。

于 2012-05-23T00:57:21.503 回答
0

您需要检查字符编码。基本上,您有一个以一种格式编码的字符串,并且您正在以另一种格式输出它。

对于国际内容(看起来您正在这样做),那么我将使用 UTF-8:-在您的 HTML 文件中添加头部(靠近顶部)-在您的 PHP 中,确保您将所有字符串处理为UTF-8 - 如果您还有一个数据库,请确保数据库、表和字段都配置为 UTF-8(警告:进行此更改可能会在没有导入/导出的情况下损坏现有数据!)。- 如果您正在阅读带有特殊字符的模板文件,还要确保它们是 UTF-8。(如果没有特殊字符,那么普通的 AscII 就可以了)

这就是简单的答案。有很多关于字符编码的内容 - 只需谷歌一下。

(替代解决方案,使用 ASCII,但将所有内容都转换为网络友好的字符代码。但是要正确获取所有代码更棘手,尤其是在处理用户输入时。)

于 2012-05-23T00:50:00.497 回答
0

您必须手动定义字符集。使用 mb_substr()。它应该有帮助。 http://php.net/manual/en/function.mb-substr.php

于 2013-04-19T11:52:26.383 回答