我想这与Converting ob_get_clean results in PHP类似,但这个答案并没有帮助我 - 所以我做了一个最小的工作"我的问题的例子。此测试中有三个文件:
utftest.txt
øæå jeść ясть
utftempl.txt
<?php echo htmlentities( $content ); ?>
utftest.php
<?php
echo 'Current PHP version: ' . phpversion() . "\r\n\r\n";
$content = file_get_contents("utftest.txt");
$templateFile = "utftempl.txt";
ob_start();
include_once($templateFile);
$file_output = ob_get_clean();
print_r($file_output);
?>
我假设utftest.txt
被正确编码为UTF-8,否则这里是hexdump:
$ hexdump -C utftest.txt
00000000 c3 b8 c3 a6 c3 a5 20 6a 65 c5 9b c4 87 20 d1 8f |...... je.... ..|
00000010 d1 81 d1 82 d1 8c 0a |.......|
00000017
我使用php-cli
解释器和php utftest.php
运行此测试。在我的本地PC上,我在终端输出了这个输出:
$ php utftest.php
Current PHP version: 5.5.9-1ubuntu4.14
øæå jeść ясть
......这是我所期待的。但是,当我将其上传到远程服务器,并通过ssh
登录到远程服务器,并在终端中执行相同的测试时,我得到了这个:
$ php utftest.php
Current PHP version: 5.3.10-1ubuntu3.21
øæå jeÅ�Ä� ÑNtilde;�Ñ�Ñ�
因此,出于某种原因,在服务器上,我获得了更多HTML实体,还有一些二进制字符?
为什么会发生这种情况 - 是因为PHP版本不同?如何在服务器上正确运行此测试脚本?
答案 0 :(得分:0)
好的,我想我找到了答案:
htmlentities destroys utf-8 strings
htmlentities()采用可选的第三个参数编码,用于定义转换中使用的编码。从PHP 5.6.0开始,default_charset值用作默认值。从PHP 5.4.0开始,UTF-8是默认值。在5.4.0之前的PHP,ISO-8859-1用作默认值。
所以,确实,问题是PHP版本,各种各样;所以修复是在utftempl.txt
中使用:
<?php //echo htmlentities( $content );
echo htmlentities( $content , ENT_QUOTES, "UTF-8");
?>
然后两个版本都会正确地完成所有事情......
这里也是utftest.php
的修改版本,调试输出略多一些:
<?php
echo 'Current PHP version: ' . phpversion() . "\r\n\r\n";
$content = file_get_contents("utftest.txt");
print_r($content);
echo "\r\nENC1: " . mb_detect_encoding($content) . "\r\n\r\n" ;
$templateFile = "utftempl.txt";
ob_start();
include_once($templateFile);
$file_output = ob_get_clean();
print_r($file_output);
echo "\r\nENC2: " . mb_detect_encoding($file_output) . "\r\n\r\n" ;
echo htmlentities( "øæå jeść ясть" ) . "\r\n\r\n" ;
echo htmlentities( "øæå jeść ясть", ENT_QUOTES, "UTF-8") . "\r\n\r\n" ;
?>