如果default_charset为空,那么字符集是什么?

4
从PHP 5.6开始,default_charset字符串被设置为"UTF-8",如在php.ini文档中所述。对于早期版本,该字符串为空。 由于我正在创建一个与PHP通信的Java库,因此需要知道当一个字符串被作为字节内部处理时应该期望哪些值。如果default_charset字符串为空并且(字面)字符串包含ASCII范围之外的字符,那么会发生什么?我应该期望平台的默认字符编码,还是源文件使用的字符编码?

2
你可以通过测试自己找出答案,但如果我不得不猜的话,我会说它只是将其视为二进制字符串。 - Niet the Dark Absol
如果字符串是字面量,它会默认使用源文件的编码吗?我这里正在运行PHP,但我只会验证自己的系统,而不是其他人的。 - Maarten Bodewes
是的,我认为是这样。找出的一个好方法是在UTF-8文件中尝试使用é - 你会得到é还是é - Niet the Dark Absol
如果我在一个使用UTF-8的PHP文件上运行它,并在UTF-8控制台上运行它,那么它会打印出é,甚至是λ...但这并不能完全回答我的问题...如果我保存为Latin并打印出éλ,那么我得到相同的输出,看起来只是字节。 - Maarten Bodewes
2个回答

8

简短回答

对于字面字符串——总是使用源文件编码。 default_charset 值在这里无效。

详细回答

PHP 字符串是 "二进制安全" 的,这意味着它们没有任何内部字符串编码。基本上,在 PHP 中字符串只是字节缓冲区。

对于字面字符串,例如$s = "Ä",这意味着字符串将包含在引号之间保存的任何字节。如果文件保存在UTF-8中,这将等同于$s = "\xc3\x84",如果文件保存在ISO-8859-1(latin1)中,则相当于$s = "\xc4"

设置 default_charset 值不会以任何方式影响存储在字符串中的字节。

那么 default_charset 是干什么用的?

一些函数必须处理作为文本的字符串,并且具有编码意识,接受 $encoding 作为参数(通常是可选的)。这告诉函数文本在字符串中编码的编码方式。

在 PHP 5.6 之前,这些可选的 $encoding 参数的默认值要么在函数定义中(例如 htmlspecialchars()),要么可以在各种 php.ini 设置中为每个扩展单独配置(例如 mbstring.internal_encodingiconv.input_encoding)。

在 PHP 5.6 中引入了新的 php.ini 设置 default_charset。旧设置已被弃用,并且所有接受可选 $encoding 参数的函数现在应将编码默认为未明确指定时的 default_charset 值。

然而,开发人员需要确保字符串中的文本实际上是以指定的编码方式进行编码的。


链接:


谢谢!我找不到任何关于这个问题的权威来源,但是对你提供的函数进行快速验证后发现它应该是正确的。如果在PHP文档中有相关来源,我会很高兴知道。 - Maarten Bodewes
@MaartenBodewes-owlstead 当然可以。添加了一些链接。 - Giedrius D

2
似乎你不应该依赖内部编码。内部字符编码可以通过mb_internal_encoding进行查看/设置。 示例phpinfo()
  • PHP版本5.5.9-1ubuntu4.5
  • default_charset无值

file1.php

<?php
$string = "e";
echo mb_internal_encoding(); //ISO-8859-1

file2.php

<?php
$string = "É";
echo mb_internal_encoding(); //ISO-8859-1
如果您不手动更改内部编码,这两个文件都将输出ISO-8859-1
<?php
echo bin2hex("ö"); //c3b6 (utf-8)
将这个字符的十六进制转换为UTF-8编码。如果您使用UTF-8保存文件,即使内部编码未设置为UTF-8,此示例中的字符串也将具有2个字节。因此,您应该依赖于源文件使用的字符编码。

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