Given that PHP does not dictate a specific encoding for strings,one might
wonder how string literals are encoded. String will be encoded in whatever
fashion it is encoded in the script
file. Thus,if the script is written in ISO-8859-1,the string will be
encoded in ISO-8859-1 and so on. However,this does not apply if Zend
Multibyte is enabled; in that case,the script may be written in an
arbitrary encoding (which is explicity declared or is detected) and
then converted to a certain internal encoding,which is then the
encoding that will be used for the string literals. Note that there
are some constraints on the encoding of the script (or on the internal
encoding,should Zend Multibyte be enabled) – this almost always means
that this encoding should be a compatible superset of ASCII,such as
UTF-8 or ISO-8859-1.
所以我的疑问是,PHP中的字符串文字只能编码为ASCII的兼容超集,例如UTF-8或ISO-8859-1,而不是编码不兼容的超集,这是真的吗?的ASCII?
是否可以在PHP中使用UTF-16,UTF-32或其他一些非ASCII兼容编码等非ASCII兼容编码对字符串文字进行编码?如果是,那么在这种非ASCII兼容编码中编码的字符串文字是否可以与mb_string_ *函数一起使用?如果不是,那是什么原因?
假设,Zend Multibyte已启用,我已将内部编码设置为兼容的ASCII超集,例如UTF-8或ISO-8859-1或其他一些非ASCII兼容编码.现在,我可以在脚本文件中声明不是ASCII兼容超集的编码,例如UTF-16或UTF-32吗?
如果是,那么在这种情况下编码字符串文字的编码是什么?如果不是,那是什么原因?
另外,如果启用了Zend Multibyte,请解释一下这个编码对于字符串文字是如何工作的?
如何启用Zend Multibyte?打开它的主要目的是什么?什么时候需要打开它?
如果你能用合适的例子清楚我的怀疑,那会更好.
谢谢.
$echo -n '<?PHP echo "' > test.PHP $echo -n 日本語 | iconv -t UTF-16 >> test.PHP $echo '";' >> test.PHP $cat test.PHP <?PHP echo "??e?g,??"; $cat test.PHP | xxd 00000000: 3c3f 7068 7020 6563 686f 2022 feff 65e5 <?PHP echo "..e. 00000010: 672c 8a9e 223b 0a g,..";. $PHP test.PHP ??e?g,??$ $PHP test.PHP | iconv -f UTF-16 日本語
这演示了一个表面上用ASCII编写的源代码文件,但在中间包含一个UTF-16字符串文字,按原样输出.
这种源代码的更大问题是难以使用.它介于颈部疼痛之间,不可能让文本编辑器在一个编码中处理PHP代码,在另一个编码中处理字符串文字.通常,您希望将整个源代码(包括字符串文字)保持在一个相同的编码中.
您也可以轻松陷入困境:
$echo -n '<?PHP echo "' > test.PHP $echo -n 漢字 | iconv -t UTF-16 >> test.PHP $echo '";' >> test.PHP $cat test.PHP | xxd 00000000: 3c3f 7068 7020 6563 686f 2022 feff 6f22 <?PHP echo "..o" 00000010: 5b57 223b 0a [W";.
“汉字”这里编码为feff 6f22 5b57,其中包含22或“,一个字符串文字终结符,这意味着你现在有语法错误.
默认情况下,PHP解释器期望PHP代码与ASCII兼容,因此如果您希望将字符串文字和其余源代码保持为相同的编码,那么您几乎只能使用ASCII兼容编码.但是,Zend Multibyte扩展允许您使用其他编码,如果您相应地声明使用的编码(在PHP.ini中,如果它不兼容ASCII).因此,您可以在整个过程中编写源代码,例如Shift-JIS;甚至可能在某些其他编码中使用字符串文字*.
*(此时我将退出详细信息,因为what is wrong with you ?!)
摘要:
> PHP必须了解所有PHP代码;默认情况下它理解ASCII,使用Zend Multibyte它也可以理解其他编码.
>源代码中的字符串文字可以包含您想要的任何字节,只要PHP不将它们解释为字符串文字中的特殊字符(例如上面的22示例),在这种情况下您需要转义它们(使用一般源代码编码中的反斜杠).
>运行时的字符串值将是从字符串文字读取的PHP的原始字节序列.
说完这一切之后,与ASCII兼容编码不同,通常是颈部疼痛.如果工作流程中的某些工具不正确地处理文件,那么文本编辑器会很痛苦并且容易导致mojibake.最多我建议使用与ASCII兼容的编码,例如:
echo "日本語"; // UTF-8 encoded (let's hope)
如果必须具有非ASCII兼容的字符串文字,则应使用字节表示法:
echo "\xfe\xff\x65\xe5\x67\x2c\x8a\x9e";
或转换:
echo iconv('UTF-8','UTF-16','日本語');
[..] will the strings literals encoded in such one of the non-ASCII compatible encoding work with
mb_string_*
functions?
当然,PHP中的字符串是所有意图和目的的原始字节数组.你怎么获得那个字符串并不重要.如果您使用上面演示的任何方法获得的UTF-16字符串,包括通过将其以UTF-16硬编码到源代码中,您有一个UTF-16编码的字符串,您可以通过任何和所有字符串函数将其放入知道如何处理它.