【问题标题】:Utf-8 encoding not working on utf-8 encoded document using php 5.5utf-8 编码不适用于使用 php 5.5 的 utf-8 编码文档
【发布时间】:2015-07-16 08:14:30
【问题描述】:

我遇到了一种非常奇怪的编码问题,我不太了解并且以前从未遇到过。我在 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"); ?>
    

执行此操作后,我本以为它会以正确的方式显示,但我仍然觉得这很奇怪——在输出中!

解决方法

为了让这个东西正确显示,我必须这样做

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

现在它以正确的方式显示。

我的问题

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

【问题讨论】:

    标签: php encoding utf-8 character-encoding


    【解决方案1】:

    使用 Git 2.18+(2018 年第二季度),您可能不需要任何第三方技巧即可将 repo 内容转换为 UTF-8,因为 新的“checkout-encoding”属性可以询问 Git在检出工作树时将内容转换为指定的编码(检入时反之亦然)。

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

    convert:添加'working-tree-encoding'属性

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

    添加一个属性来告诉 Git 用户定义了什么编码 给定的文件。如果内容被添加到索引中,那么 Git 会重新编码 将内容转换为规范的 UTF-8 表示。结帐时,Git 将 反转这个操作。

    如果有任何问题,您现在可以通过the GIT_TRACE_WORKING_TREE_ENCODING environment variable 启用对使用“working-tree-encoding”属性重新编码的内容的跟踪。
    这对于调试编码问题很有用。

    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 格式的文件,并在启用了 working-tree-encoding 的 Git 客户端添加 foo.ps1,则 foo.ps1 将在内部存储为 UTF-8。
      不支持working-tree-encoding 的客户端会将foo.ps1 检出为UTF-8 编码文件。这通常会给该文件的用户带来麻烦。

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

    • 重新编码内容需要可能会减慢某些 Git 操作的资源(例如“git checkout”或“git add”)。

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


    例如,如果您的“*.ps1”文件是 使用字节顺序标记 (BOM) 编码的 UTF-16,您希望 Git 执行 根据您的平台自动换行。

    *.ps1     text working-tree-encoding=UTF-16
    

    如果您的“*.ps1”文件是 UTF-16 little,请使用以下属性 没有 BOM 的 endian 编码,您希望 Git 使用 Windows 行尾 在工作目录中。
    请注意,如果使用working-tree-encoding 属性以避免歧义,强烈建议使用eol 明确定义行结尾。

    *.ps1 text working-tree-encoding=UTF-16LE eol=CRLF
    

    【讨论】:

      【解决方案2】:

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

      你能不能试试

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

      在你有&lt;?php echo "übermotivierter"; ?&gt;的地方?
      它的输出是什么?

      【讨论】:

      • �bermotivierter fc 62 65 72 6d 6f 74 69 76 69 65 72 74 65 72
      • 那我怀疑你是否成功地将文件的编码切换为utf-8;它仍然是 iso-8859-1 ;-)
      • 但 IDE 设置为 UTf-8。会不会和git checkout有关?
      猜你喜欢
      • 2012-12-08
      • 2012-03-10
      • 2012-08-02
      • 1970-01-01
      • 2021-03-22
      • 2021-04-04
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      相关资源
      最近更新 更多