如何最好地配置 PHP 来处理 UTF-8 网站 [重复]

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

您会推荐哪些扩展以及应该如何最好地配置 php 来创建一个对所有内容都使用 utf-8 编码的网站。例如...

  • 页面输出为utf-8
  • 表单提交以utf-8编码的数据
  • 字符串数据的内部处理(例如与数据库通信时)也全部采用 utf-8 格式。

目前php似乎并不能很好地处理多字节字符集。到目前为止,我已经发现 mbstring 看起来是一个重要的扩展。

值得这么麻烦吗..?

php utf-8
6个回答
58
投票

关于 PHP 与 Unicode 内容的假定问题有些被夸大了。我自 1998 年以来一直在做多语言网站,直到我在某处读到它之前我才知道可能存在问题 - 许多年之后的网站。

这对我来说效果很好:

Apache 配置(在 httpd.conf 或 .htaccess 中)

AddDefaultCharset utf-8

PHP(在 php.ini 中)

default_charset = "utf-8"
mbstring.internal_encoding=utf-8
mbstring.http_output=UTF-8
mbstring.encoding_translation=On
mbstring.func_overload=6 

MySQL

CREATE
具有
utf8_*
排序规则的数据库, 让表继承数据库排序规则并 以
"SET NAMES utf8"

开始每个连接

HTML(在 HEAD 元素中)

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

4
投票

我遇到了同样的问题

UTF-8 characters
,一切都在实时服务器和登台服务器上运行,但有时它在我的开发机器上崩溃了。这种行为很奇怪,有时字符编码正确,但在随机页面重新加载时,它开始破坏
Diamond Charters
'���เห็นอเวิลด์!���'
Question mark
'??�เห็นอเวิลด์!???'
或 85% 数据正确渲染
'เห็นอเวิลด์!?��'
但其余 15% 显示了不匹配的字符。我一直想解决这个问题。所以,从我的清单开始

1 - 检查 HTML 中是否添加了字符标题


2 - 检查数据是否正确保存在MySQL表中


3 - 检查 MySQL 是否有正确的 UTF-8 编码设置


4 - 检查 Apache 是否有处理 UTF-8 字符集的设置


5 - 检查简单的 PHP 是否可以回显“เห็นอเวิลด์”输出与输入“เห็นอเวิลด์”


6 - 检查 PHP 是否发送正确的 headers 输出


7 - 检查 MySQL 查询是否获取相同的数据“เห็นอเวิลด์”


8 - 检查“เห็นอเวิลด์”是否有一些html字符,正确处理它们


9 - 检查“เห็นอเวิลด์”是否通过任何 html 编码解码函数


10-检查.htaccess是否全部设置为处理UTF-8字符集


检查上面的所有列表,找出哪些东西..破坏了。

尝试一下(我正在使用Codeigniter):

=================================
:: PHP ini Settings::
=================================

default_charset = "utf-8"
mbstring.internal_encoding=utf-8
mbstring.http_output=UTF-8
mbstring.encoding_translation=On
mbstring.func_overload=6 

=================================
:: .htaccess Settings::
=================================

DefaultLanguage en-US
AddDefaultCharset UTF-8

=================================
:: HTML Header Page::
=================================

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

=================================
:: PHP Codeigniter index.php ::
=================================

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

=================================
:: Codeigniter config.php ::
=================================

$config['charset'] = 'UTF-8';

=================================
:: Codeigniter database.php ::
=================================

$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';

=================================
:: Codeigniter helper function (optional)
=================================

if(!function_exists('safe_utf_string')){
    function safe_utf_string($utf8string= ''){
        $utf8string = htmlspecialchars($utf8string, ENT_QUOTES, 'UTF-8');
        return mb_convert_encoding($utf8string, 'UTF-8');
    }
}

最后别忘了说声谢谢! :) 到@djn回答


2
投票

php 应付得很好!

您应该将 php.ini“default_charset”参数设置为“utf-8”。

确保:-

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

位于您所服务的每个页面的顶部。

有几个问题领域:

数据库——确保它们配置为默认使用 utf-8,否则将陷入痛苦的世界。

IDE/编辑器——很多编辑器不能很好地支持 utf-8。我通常使用 vim,但它从来都不是一个大问题。

文档——刚刚花了一整个下午让 php 从电子表格中读取泰语字符。我最终成功了,但仍然不确定我做对了什么。


2
投票

请注意,这些 php.ini 条目已弃用;

;mbstring.internal_encoding = utf-8
;mbstring.http_input =
;mbstring.http_output = utf-8

下一步...

PHP - 通过 Web 应用程序的 config.php 文件为以下内容设置 utf8

 ini_set('default_charset', 'UTF-8');                                    
 mb_internal_encoding('UTF-8');
 iconv_set_encoding('internal_encoding', 'UTF-8');
 iconv_set_encoding('output_encoding', 'UTF-8');

MariaDB / MySQL - 通过以下方式设置 utf8:

 mysqli::set_charset ( "utf8mb4" );

HTML 页面 - 通过以下方式设置:

 <meta charset="utf-8" > 
  

1
投票

如果 mbstring 还不是您的 PHP 包的一部分,那么我肯定会向您推荐它 - 您甚至会想使用它来计算表单输入的字符串长度( mb_strlen($string_var, 'utf8') )。 。 否则,除了有效且正确的 HTML、正确的 http-server-config(因此服务器将提供不支持 utf-8 的页面)和支持 utf-8 的文本编辑器(例如 Notepad++)之外,您不需要任何东西。


1
投票

在你的 php.ini 中设置

mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On

这样您就不需要每次都将编码参数传递给 mb_ 函数。

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