为何PHP中使用按位非运算符~õ无法输出换行?
PHP Golf中
echo ~õ;无法输出换行的原因解析 为什么该写法本该输出换行
这是早期PHP Golf里的字节优化技巧,核心依赖**单字节编码(如ISO-8859-1/Latin-1)**的字符处理逻辑:
- 换行符
\n的ASCII值为10 - PHP的按位非运算符
~遵循~x = -x -1的运算规则,要通过~x得到对应换行的10,反向推导可得x = -11。在8位无符号整数范围(0-255)内,-11对应的无符号值为245(256-11=245) - 在ISO-8859-1编码中,ASCII值245对应的字符就是
õ。执行echo ~õ;时,PHP会先把õ转成整数245,按位非后得到-246;echo输出该整数时,会取其低8位无符号值-246 & 0xFF = 10,最终输出ASCII值10对应的换行符。
这种写法仅占8字节,比echo "\n";(10字节)、直接写换行的echo " ";(9字节)更短,完全符合PHP Golf追求最短代码的需求。
现在输出<J的原因
当前几乎所有开发环境默认使用UTF-8编码,而õ在UTF-8中是双字节字符(编码为0xC3 0xB5):
- PHP处理该字符时,会将整个双字节序列解析为一个整数(十进制50101),而非单字节下的245
- 执行
~50101得到-50102,echo输出该整数时,对应的字符序列在UTF-8编码下被解析为<J,完全偏离了原本的换行符逻辑。
简言之,编码环境从单字节切换到UTF-8,是导致这个老技巧失效、输出异常的核心原因。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

