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

时间:2014-12-07 17:37:34

标签: php string character-encoding

在PHP 5.6之后,default_charset字符串设置为"UTF-8",如下所述。 in the php.ini documentation。它表示早期版本的字符串为空。

当我创建一个与PHP通信的Java库时,我需要知道在内部处理字符串时我应该期待哪些值。如果default_charset字符串为空且(文字)字符串包含ASCII范围之外的字符,会发生什么?我应该期望平台的默认字符编码,还是用于源文件的字符编码?

2 个答案:

答案 0 :(得分:7)

简短回答

对于文字字符串 - 始终是源文件编码。 default_charset值在此处不起作用。

更长的答案

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

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

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

default_charset做了什么?

某些函数必须以 text 处理字符串并且可识别编码,接受$encoding作为参数(通常是可选的)。这告诉函数文本在字符串中编码的编码。

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

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

但是,开发人员有责任确保字符串中的文本实际上是以指定的编码进行编码。


链接:

答案 1 :(得分: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保存文件,则此示例中的字符串将具有2个字节,即使内部编码未设置为UTF-8。因此,您应该依赖用于源文件的字符编码。