【问题标题】:Encoding problem (UTF-8) in PHPPHP中的编码问题(UTF-8)
【发布时间】:2010-11-26 04:38:24
【问题描述】:

我想在 PHP 中输​​出以下字符串:

ä ö ü ß €

因此,我手动将其编码为 utf8:

ä ö ü ß €

所以我的脚本是:

<?php
header('content-type: text/html; charset=utf-8');
echo 'ä ö ü ß €';
?>

前 4 个字符是正确的 (ä ö ü ß),但遗憾的是 € 符号不正确:

ä ö ü ß

Here you can see it.

你能告诉我我做错了什么吗?我的编辑器 (Notepad++) 具有编码 (Ansi/UTF-8) 和格式 (Windows/Unix) 的设置。我必须更改它们吗?

我希望你能帮助我。提前致谢!

【问题讨论】:

  • 您应该使用支持 UTF-8 的编辑器。您所做的只是使用 ISO 8859-1 编写 UTF-8 的代码字。使用 UTF-8 你可以直接写ä ö ü ß €
  • 啊,对不起,它是 Windows-1252 而不是 ISO 8895-1
  • 但请注意,使用 UTF-8 可能会在文件开头插入 U+FEFF。而 PHP 根本不喜欢这样。
  • @Johannes -- 我从来没有遇到过这个问题。您在使用 UTF-8 编码文件时遇到过什么问题?
  • @warpech / @Johannes Rössel:这是字节顺序标记 (BOM)。这里有更多关于它的信息:decodeunicode.org/de/U+FEFF 在 Notepad++ 中,你可以选择“UTF-8 without BOM”作为编码,你不会遇到问题。

标签: php encoding utf-8


【解决方案1】:

最后一个字符不在文件中(尝试查看源代码),这就是您看不到它的原因。

我认为您最好将 PHP 文件保存为 UTF-8(在 Notepad++ 中,选项在 Format -> Encode in UTF-8 without BOM 中可用),然后在 PHP 文件中插入实际字符(即在Notepad++),而不是到处乱插Ã。您可能会发现 Windows 字符映射对于插入 unicode 字符很有用。

【讨论】:

  • 不,我不这么认为。一切安好。感谢您使用 Notepad++ 的提示!
【解决方案2】:

欧元符号 (U+20AC) 以 UTF-8 编码,使用三个字节,而不是两个字节。这可以看到here。所以你的编码是错误的。

【讨论】:

  • 谢谢,这似乎是原因。 :)
  • 处理文本从输入中删除无效字节序列的情况并不少见。因此,当您宣传 UTF-8 并包含无效的 UTF-8 时,不要指望它会出现。
【解决方案3】:

如果你想正确输出到 utf8,你的脚本应该是:

<?php
header('content-type: text/html; charset=utf-8');
echo "\xc3\xa4"."\xc3\xb6"."\xc3\xbc"."\xc3\x9f"."\xe2\x82\xac";
?>

这样即使你的 php 脚本被保存为非 utf-8 编码,它仍然可以工作。

【讨论】:

  • 谢谢。回声线到底是做什么的?
  • 它回显以 utf8 编码的以下每个字符:ä ö ü ß €。在您最初的问题中,您说“我已手动将其编码为 utf8”。要真正做到这一点,请转到 utf8-chartable.de 并搜索 ä,您会在 utf8 中看到它是 "\xc3\xa4";
【解决方案4】:

您应该始终将您的编辑器设置为生成的 HTML 指示浏览器使用的相同编码。如果打算将 HTML 页面解释为 UTF-8,则将文本编辑器设置为 UTF-8。 PHP 完全不知道用于创建文件的编辑器的编码设置;它将字符串视为字节流。

换句话说,只要文件中有正确的字节,一切都会正常工作。确保文件中包含正确字节的最简单方法是将您的编码设置为与网页应该包含的相同的编码。其他任何事情都会使生活变得比需要的更困难。

但最好的防御措施是完全将非 ASCII 字符排除在代码之外。您可以将它们从数据库或本地化文件中提取出来。这意味着基本上可以在任何编辑器中修改代码,而不必担心损坏编码。

【讨论】:

  • 谢谢,我以后会这样做的。它真的会让编码变得更容易。
【解决方案5】:
header('Content-Type: text/html; charset=UTF-8');

这只是告诉浏览器你要发送什么样的内容以及它应该如何处理它。它不会设置您发送的实际内容的编码。履行自己的诺言完全取决于您。您的内容不会因为您设置了该标头而神奇地从任何内容转换为 UTF-8。如果您告诉浏览器将内容视为 UTF-8,但您发送的是 Latin-1 编码数据,它当然会中断。

我推荐你What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

【讨论】:

    【解决方案6】:

    这对我有用

        if (mb_check_encoding($value, 'UTF-8')) {
          return $value = utf8_encode($value);  
        }  
        else  {
          return $value;
        }
    

    来源:https://github.com/jdorn/php-reports/issues/100

    【讨论】:

      【解决方案7】:

      试试这个它对我有用。此代码将 ã¶ 更改为 ö

      <?php
      
      header('Content-Type: text/html; charset=UTF-8');
      echo $category = 'Computer & Zubehör';
      exit;
      
      ?>
      

      结果: 电脑和Zubehör

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2014-03-18
        相关资源
        最近更新 更多