我遇到了一种非常奇怪的编码问题,我真的不理解,也从未有过。我在Ubuntu机器上使用PHP 5.5只是为了获取信息。
解决问题
我有一个简单的文件index.php,我想打印这个简单的字符串
<?php echo "übermotivierter"; ?>
在浏览器中查看时,我希望以下输出
�bermotivierter
这就像预期的那样!
要以正确的方式显示此信息,我已完成以下步骤
设置适当的html元标记
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
设置适当的php标头
<?php header("Content-Type: text/html; charset=utf-8"); ?>
在这样做之后,我本来希望这能以正确的方式显示,但我仍然在输出中得到这个!:
解决方法
要使这个东西正确显示,我必须这样做
<?php echo utf8_encode("übermotivierter"); ?>
现在以正确的方式显示。
我的问题
当我的文档已经编码并保存在utf-8中时,我真的不明白为什么我必须使用 utf8_encode 。这对我没有任何意义。对此有何解释?
答案 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 e92d622,commit 541d059,commit 7a17918,commit 107642f,commit c6e4865,commit 10ecb82,commit 2f0c4a3(2018年4月15日) ,commit 66b8af3(2018年3月9日),commit 13ecb46,commit 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