Utf-8编码不能使用php 5.5在utf-8编码的文件上工作

时间:2015-07-16 08:14:30

标签: php encoding utf-8 character-encoding

我遇到了一种非常奇怪的编码问题,我真的不理解,也从未有过。我在Ubuntu机器上使用PHP 5.5只是为了获取信息。

解决问题

我有一个简单的文件index.php,我想打印这个简单的字符串

<?php echo "übermotivierter";  ?>

在浏览器中查看时,我希望以下输出

�bermotivierter

这就像预期的那样!

要以正确的方式显示此信息,我已完成以下步骤

  1. 将我的IDE(Zend Studio)的编码更改为UTF-8并再次保存文件
  2. 设置适当的html元标记

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
  3. 设置适当的php标头

    <?php header("Content-Type: text/html; charset=utf-8"); ?>
    
  4. 在这样做之后,我本来希望这能以正确的方式显示,但我仍然在输出中得到这个!:

    解决方法

    要使这个东西正确显示,我必须这样做

    <?php echo utf8_encode("übermotivierter");  ?>
    

    现在以正确的方式显示。

    我的问题

    当我的文档已经编码并保存在utf-8中时,我真的不明白为什么我必须使用 utf8_encode 。这对我没有任何意义。对此有何解释?

2 个答案:

答案 0 :(得分:1)

不是答案,但评论时间太长了:

请你试试

<?php
$s = "übermotivierter";
echo '<p>', $s, '</p><p>';
for($i=0; $i<strlen($s); $i++) {
    printf('%02x ', ord($s[$i]));
}
echo '</p>';

<?php echo "übermotivierter"; ?>的地方? 那是什么输出?

答案 1 :(得分:1)

使用Git 2.18 +(2018年第二季度),您可能不需要任何第三方技巧将回购内容转换为UTF-8,因为 new&#34; checkout-encoding&#34;在签出工作树时(以及在签入时反过来),Git可以要求Git将内容转换为指定的编码。

请参阅commit e92d622commit 541d059commit 7a17918commit 107642fcommit c6e4865commit 10ecb82commit 2f0c4a3(2018年4月15日) ,commit 66b8af3(2018年3月9日),commit 13ecb46commit a8270b0(2018年2月15日)Lars Schneider (larsxschneider)(由Junio C Hamano -- gitster --合并于commit 1ac0ce4,2018年5月8日)

  

convert:添加&{39; working-tree-encoding&#39;属性

     

Git识别用ASCII或其中一个超集编码的文件(例如   UTF-8或ISO-8859-1)作为文本文件   所有其他编码通常被解释为二进制,因此内置的Git文本处理工具(例如&#39; git diff&#39;)以及大多数Git Web前端都不会显示内容。

     

添加一个属性来告诉Git用户为a定义的编码   给定文件。如果内容被添加到索引,则Git重新编码   内容为规范的UTF-8表示。结帐时Git会   扭转此行动。

如果出现任何问题,您现在可以the GIT_TRACE_WORKING_TREE_ENCODING environment variable启用对使用&#39; working-tree-encoding&#39;重新编码的内容的跟踪功能。属性。
这对调试编码问题很有用。

documentation现在提到:

  

请注意,使用working-tree-encoding属性可能会有   陷阱数量:

     
      
  • 替代Git实现(例如JGit或libgit2)和较旧的Git   版本(截至2018年3月)不支持working-tree-encoding   属性。
      如果您决定在存储库中使用working-tree-encoding属性,则强烈建议确保使用存储库的所有客户端都支持它。

         

    例如,Microsoft Visual Studio资源文件(*.rc)或   PowerShell脚本文件(*.ps1)有时以UTF-16编码   如果您将*.ps1文件声明为UTF-16,并添加foo.ps1并启用了working-tree-encoding Git客户端,那么foo.ps1将在内部存储为UTF-8。 />   没有working-tree-encoding支持的客户端会将foo.ps1签出为UTF-8编码文件。这通常会给这个文件的用户带来麻烦。

         

    如果不支持working-tree-encoding属性的Git客户端添加了新文件bar.ps1,那么bar.ps1将被存储&#34;原样&#34;内部(在此示例中可能为UTF-16)   支持working-tree-encoding的客户端会将内部内容解释为UTF-8,并在结帐时尝试将其转换为UTF-16。该操作将失败并导致错误。

  •   
  • 重新编码内容需要的资源可能会降低某些Git操作的速度(例如&#39; git checkout&#39;或{39}}&#39;)。

  •   
     

仅在无法存储文件时才使用git add属性   在UTF-8编码中,如果你希望Git能够处理内容   作为文本。

  

例如,如果你的working-tree-encoding&#39;使用以下属性?文件是   UTF-16使用字节顺序标记(BOM)编码,您希望Git执行   基于您平台的自动行结束转换。

*.ps1
     

如果你的*.ps1 text working-tree-encoding=UTF-16 &#39;使用以下属性?文件是UTF-16很少   endian编码没有BOM,你希望Git使用Windows行结尾   在工作目录中   请注意,如果使用*.ps1属性来避免歧义,强烈建议使用eol明确定义行结尾。

working-tree-encoding