UTF-8与PHP ob_get_clean / include_once + htmlentities不正确?

时间:2016-01-18 11:42:33

标签: php utf-8

我想这与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

&oslash;&aelig;&aring; jeść ясть

......这是我所期待的。但是,当我将其上传到远程服务器,并通过ssh登录到远程服务器,并在终端中执行相同的测试时,我得到了这个:

$ php utftest.php 
Current PHP version: 5.3.10-1ubuntu3.21

&Atilde;&cedil;&Atilde;&brvbar;&Atilde;&yen; je&Aring;�&Auml;� &Ntilde;Ntilde;�&Ntilde;�&Ntilde;�

因此,出于某种原因,在服务器上,我获得了更多HTML实体,还有一些二进制字符?

为什么会发生这种情况 - 是因为PHP版本不同?如何在服务器上正确运行此测试脚本?

1 个答案:

答案 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" ;

?>