将PHP默认编码设置为UTF-8

36
在“PHP Cookbook”中(第589页)提到,为了正确设置传出数据的字符编码为UTF-8,需要编辑default_encoding配置为utf-8。然而,在文件php.ini中我找不到这个配置项。是否应该简单地添加一行代码:default_encoding = "utf-8"
我有一个; default_charset = "iso-8859-1"。如您所见(;),目前它没有激活。我应该删除分号并将其设置为"utf-8"吗?这样做会处理默认编码吗?
我还发现其他编码指令,但不知道该怎么办。
[iconv]
;iconv.input_encoding = ISO-8859-1
;iconv.internal_encoding = ISO-8859-1
;iconv.output_encoding = ISO-8859-1
...
; http://php.net/exif.encode-unicode
;exif.encode_unicode = ISO-8859-15
...
;mssql.charset = "ISO-8859-1"
...
;exif.encode_unicode = ISO-8859-15

我是否可以把所有编码都替换为utf-8呢?有没有什么理由不这样做?


“PHP Cookbook”是什么?是指书名为“PHP Cookbook: Solutions and Examples for PHP Programmers”还是其他内容? - Peter Mortensen
5个回答

53

您应该将default_charset设置为UTF-8:

default_charset = "utf-8"

(PHP Cookbook可能存在排版错误,如果他们要求你更改default_encoding,我从未听说过这个。)

如果您要输出UTF-8编码的字符,请确保您的Web服务器设置为输出UTF-8。在Apache中,可以通过在httpd.conf文件中进行设置:

AddDefaultCharset UTF-8

关于修改iconvexifmssql的编码设置,你可能不需要设置这些(你的设置已经将它们注释掉了),但是将它们全部改为UTF-8是一个好主意。


对于Apache,我没有http.conf文件。我使用WAMPserver,他们提供带有httpd.conf文件的Apache。我想它们是一样的吧?此外,这是您手动添加的行吗?我的httpd.conf文件中没有关于字符集的内容。 - JDelage
1
那实际上是我打错了(已更正)。如果你在配置文件中没有看到对于AddDefaultCharset的引用,你可能需要查看一下所包含的配置文件(它会像 Include conf/extra/[something] 这样)是否在其中任何一个中进行了设置。如果没有,就将其添加到主要的httpd.conf文件中即可。 - Ben D
有没有一些解释来说明所有这些编码函数的作用? - CMCDragonkai
@CMCDragonkai - 你是在询问字符编码的一般解释,还是具体询问所列设置的控制? - Ben D
列出的设置中,有很多来自iconv和mb_string。 - CMCDragonkai
不需要在http.conf中使用AddDefaultCharset。请参见https://httpd.apache.org/docs/2.4/mod/core.html。meta将覆盖此设置。 - Kiran

10

修改这行代码

;default_charset = "iso-8859-1"

阅读

default_charset = "utf-8"

关于其他选项,请不要触碰它们。避免使用默认设置,在您所做的一切中始终明确设置编码。
  • 数据库连接,
  • 读写文件,
  • 使用iconv进行转换。
此外,请注意PHP文件保存的编码方式,确保它们是UTF-8,特别是如果它们包含要显示或比较的字符串。

4

我在MySQL查询中遇到了问题,它无法识别一些拉丁重音符号,因此查询失败。我以为可能是PHP文件等问题,直到我发现使用PDO调用MySQL函数时必须添加字符集。奇怪的是,在我之前使用的服务器上它能够正常工作!

$dsn = 'mysql:host=localhost;dbname=retirodo_main;charset=utf8';
- - - - - - - - - - - - - - - - - - - - - - - - - ^^^^^^^^^^^^

@Marcos 当您编辑答案时,我发现加粗格式被删除,并翻译成了“**”…答案不应该是您看到的那个文本,因为那是加粗标记。 - Miguel
已修复,@miguel,抱歉。 - Marcos Pérez Gude

1
在{{link1:htaccess}}层面(.htaccess文件),PHP指令应该是php_value default_charset UTF-8

-3
为了解决这个问题,我将“UTF-8”更改为“UTF-8”(没有破折号),从而解决了问题。
这是在CentOS上发生的。

1
“without the dash”是什么意思?它们看起来一样啊。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接