解析php文件utf-8,UTF-8文件中的PHP源代码;如何正确解读?

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“.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值