Given that PHP does not dictate a specific encoding for strings,one might@H_403_3@ wonder how string literals are encoded. String will be encoded in whatever@H_403_3@ fashion it is encoded in the script@H_403_3@ file. Thus,if the script is written in ISO-8859-1,the string will be@H_403_3@ encoded in ISO-8859-1 and so on. However,this does not apply if Zend@H_403_3@ Multibyte is enabled; in that case,the script may be written in an@H_403_3@ arbitrary encoding (which is explicity declared or is detected) and@H_403_3@ then converted to a certain internal encoding,which is then the@H_403_3@ encoding that will be used for the string literals. Note that there@H_403_3@ are some constraints on the encoding of the script (or on the internal@H_403_3@ encoding,should Zend Multibyte be enabled) – this almost always means@H_403_3@ that this encoding should be a compatible superset of ASCII,such as@H_403_3@ 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它也可以理解其他编码.@H_403_3@>源代码中的字符串文字可以包含您想要的任何字节,只要PHP不将它们解释为字符串文字中的特殊字符(例如上面的22示例),在这种情况下您需要转义它们(使用一般源代码编码中的反斜杠).@H_403_3@>运行时的字符串值将是从字符串文字读取的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编码的字符串,您可以通过任何和所有字符串函数将其放入知道如何处理它.