PHP:西里尔字符显示不正确

问题描述 投票:0回答:9

最近我将托管从一个提供商切换到另一提供商,并且在显示西里尔字符时遇到问题。从数据库中读取的字符可以正确显示,但在 php 文件中硬编码的字符则不能正确显示(它们显示为问号)。

包含php源代码的文件以utf-8格式保存。帮助任何人吗?

php unicode utf-8 character
9个回答
5
投票

尝试在 head 部分放置一个指示编码的元标记:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

4
投票

我的 PHP 模块完全有同样的问题,所有文本都像“??????????????????”

我的代码是用Notepad++编写的。我找到了问题的解决方案。问题不在于标头字符集或元标记,因为浏览器实际上知道它是 UTF-8 字符集。我尝试了浏览器中的所有编码,结果是相同的,所以我知道问题出在其他地方,而不是浏览器字符编码中。

我刚刚用Notepad++打开了PHP模块并选择了所有代码。之后,我在“编码”菜单中选择“转换为 UTF-8”。上传到服务器后,一切都顺利了。


2
投票

连接数据库后放置:

mysql_query("SET NAMES UTF8");

对于mysqli

mysqli_query($connecDB,"SET NAMES UTF8");

并在页面标题中:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

2
投票

这个问题看起来很奇怪。
这些问号是什么形式?是带有问题的黑色钻石还是只是简单的问号?
首先,仔细检查您的文件是否确实经过

utf-8
编码。
尝试将此标头添加到您的代码中(在所有输出之上)

header('Content-Type: text/html; charset=utf-8'); 

但我怀疑这会有帮助,因为你的数据库文本看起来已经不错了。
您的代码中有任何

SET NAMES
查询吗?设置了什么
charset


1
投票

这与php文件的编码有关。这些文件是使用 Windows 记事本创建的,并使用 utf-8 编码保存。

当我使用Notepad2打开文件时,文件的编码是“utf-8 with签名”。当我将编码更改为“utf-8”时,文本显示正确。


0
投票

问题的原因通常是程序员的编辑器意外地重新编码了脚本文件。对依赖于 php 文件中的编码的字符串进行硬编码并不是一个好习惯。

尝试切换浏览器的编码以查找硬编码文本使用的编码,这可能会帮助您解决问题。还要确保为每个页面发送正确的 http 标头:

header('Content-Type: text/html; charset=utf-8');

您可以选择在 HTML 中插入元标记:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

0
投票

对我来说,造成差异的一行是:

$mysqli->set_charset("utf8")

直接来自 PHP 文档页面

服务器返回拉丁语,将字符集设置为 utf8 后现在工作正常。


0
投票

这是正确的值,必须这样设置:

$mail->CharSet    = 'Windows-1251'; //  fix for russian Letters


-1
投票

我一直在与这个完全相同的问题作斗争,因为我试图向小部件上的一些控件添加一些法语/德语国际化。

存储在我的数据库中的带有重音符号的字符可以很好地打印为 UTF-8。但是,在 PHP 文件中硬编码到数组中的字符要么显示为内部带有问号的黑色菱形,要么显示为小方框。

我尝试过以各种方式对 php 文件中的硬编码字符串进行编码/解码,但无法正确显示字符。

由于我的字符集如此有限并且严格使用 HTML,因此我只是向我的 intl 类添加了一些功能来替换 html 实体的字符。

我有这些属性。

static $accentEntities = array('á' => '&aacute;', 
                               'É' => '&Eacute;',
                               'é' => '&eacute;', 
                               'í' => '&iacute;', 
                               'û' => '&ucirc;', 
                               'ü' => '&uuml;');
static $accents = array();
static $entities = array();

我在构造函数中设置了一些替换数组...

foreach (self::$accentEntities as $char => $entity) {
  self::$accents[] = $char;
  self::$entities[] = $entity;
}

然后,当我在课堂上需要一个硬编码字符串时,我只需像这样返回它......

return str_replace(self::$accents,self::$entities,$str);

这完全是贫民区的解决方案……但就目前而言,它有效。我绝对想知道显示硬编码到 PHP 文件中的重音符号/特殊字符的正确方法。

© www.soinside.com 2019 - 2024. All rights reserved.