TL; DR
ASCII
在PHP 5.4之前,PHP解释器根本不关心PHP文件的字符集,事实证明zend.script_encoding ini directive只出现在该版本中.它总是将它视为ASCII.
当PHP需要识别,例如,一个函数名称,恰好包含超出ASCII-7bit的字符(好吧,任何带有任何标签的标签实体,但你得到我的观点…),它只是寻找一个函数具有相同字节序列的符号表 – 以一种方式编写的变音符号(或其他……)将被视为与以另一种方式编写的变音符号不同.试试吧.为了向后兼容,如果未设置zend.script_encoding,则这仍然是默认行为.另请注意the regex showing what is a valid identifier,您可以看到charset为中性(嗯…除了拉丁字母,它们在ASCII-7bit范围内),但显示字节.
这也引导我们进入declare(encoding)构造.如果你在一个文件中看到那个,那就是那个特定文件的权威字符集(仅限).使用别的东西,直到你遇到一个,如果你看到多个 – 在声明声明后尊重第二个.
如果没有……
在静态上下文中(即,当您不知道有效的ini设置时),当字符集很重要时,您需要回退到其他东西(理想情况下是用户定义的东西),否则只需处理ASCII-7bit以外的字符作为纯二进制,并以一些统一的代码点方式显示它们.
在动态上下文中(例如,如果您可以重新命名文件片刻,请在该位置创建一个临时文件,使用该名称;让它回显zend.script_encoding的值;恢复正常文件),您应该使用zend.script_encoding值如果可用,则回退到其他东西(就像在静态上下文中一样).
相同的处理方法适用于字符串,HTML片段和PHP文件的任何其他内容 – 它只是作为二进制字符串读取,除了某些对PHP词法分析器很重要的ASCII字符(即字节),例如序列“
>
Is there a restriction on what encoding are allowed?
似乎没有任何允许的编码列表,或者至少我找不到一个.鉴于这是–enable-zend-multibyte编译设置的后续版本,所有版本的UTF编码肯定都在该列表中.即使其他(ANSI)编码对PHP本身没有影响,也不应该阻止您将该值用作提示.
>
How does “declare(encoding)” work if the source file is UTF-16 (null 8 bit bytes between 8 bit ascii chars for the declaration)?
使用zend.script_encoding直到遇到声明(编码).如果未设置,则假定为ASCII.即使在UTF-16文件中这也不应该是一个问题……对吗? (我不使用UTF-16)
>
If the .ini or the file setting is UTF-8 or otherwise, then identifiers are presumably taken only from code points in range x41-xFF, but not from code points x100 up?
我没有尝试提供无效的UTF-8字节来告诉你那个问题的答案,手册也没有提出任何问题.我会假设PHP执行失败,并在其上发生解析错误.或者至少它应该.就你的工具而言,它应该报告无效的UTF-8序列,因为即使PHP允许它,这仍然是QA问题.
>
For UTF encodings, are characters in strings represented as their UTF code point (that makes no sense since PHP strings seem only have 8 bit characters)?
否.字符串和非PHP内容中的字符仍被视为一个字节序列,您可以通过查看strlen()的输出来确认它,并查看它与mb_strlen()的区别,后者是尊重的编码(嗯……它确实尊重mbstring.internal_encoding设置,但仍然).
>
If not, what does it mean to set the encoding to UTF something?
AFAIK,它会影响符号表中的查找.使用UTF设置,变音符号以不同的方式编写,或以不同的UTF风格编写,最终使用相同的UTF代码点…它们都会聚合在相同的符号上,而不是没有声明(编码),其中逐字节字节比较完成了.我在这里说“AFAIK”,因为坦率地说,我自己从未使用过这样的实验……我是“做得好”的一切 – 有效 – UTF-8′-er“.