【问题标题】:Getting ’ instead of an apostrophe(') in PHP在 PHP 中获取 ’ 而不是撇号(')
【发布时间】:2010-02-18 20:33:56
【问题描述】:

我尝试将文本转换为 utf8 或从 utf8 转换,但这似乎没有帮助。

我明白了:

"It’s Getting the Best of Me"

应该是:

"It’s Getting the Best of Me"

我从this url.获取这些数据

【问题讨论】:

  • 当人们从 Mac 上发送即时消息或发送电子邮件给我时,我有时会看到这种情况。期待看到解决方案。
  • 是的,我也在使用 MAMP Pro 在 Mac 上测试代码。
  • 如果来自 MySQL 表,这里给出的修复都不合适。

标签: php utf-8 character-encoding mojibake


【解决方案1】:

试试这个

如果$text 包含奇怪的字符,请执行以下操作:

$mytext = mb_convert_encoding($text, "HTML-ENTITIES", 'UTF-8');

你就完成了..

【讨论】:

    【解决方案2】:

    要转换为 HTML 实体:

    <?php
      echo mb_convert_encoding(
        file_get_contents('http://www.tvrage.com/quickinfo.php?show=Surviver&ep=20x02&exact=0'),
        "HTML-ENTITIES",
        "UTF-8"
      );
    ?>
    

    有关更多编码选项,请参阅mb_convert_encoding 的文档。

    【讨论】:

    • 这行得通,虽然我不知道让它在 fopen 上工作
    • 获得所需文件的内容后,将其作为第一个参数传递给mb_convert_encoding()。例如,$text = fgets($fp); $html = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8");
    • 域不再有效。
    • 在 html 实体无法为 RSS 提要之类的内容创建有效 URL 的 URL 中怎么办?
    • @GreenGiant:我的回答只是向您展示了如何从一种编码转换为另一种编码。 URL(不包括域)可以包含 Unicode 字符;至少现代浏览器知道如何显示它们。例如,这是一个有效的 URL:en.wikipedia.org/wiki?。 (虽然 SO 在 wiki 之后吃斜线。)所以 UTF-8 通常是 URL 可接受的编码。但是如果你想避免这种情况,你可以尝试使用'ASCII'作为第二个参数。它显然不支持那么多字符,所以你最终可能会得到 '?'占位符。
    【解决方案3】:

    我知道问题已得到解答,但设置元标记对我的情况没有帮助,并且选择的答案不够清楚,所以我想提供更简单的答案。

    所以为了简单起见,将字符串存储到一个变量中并像这样处理

    $TVrageGiberish = "It’s Getting the Best of Me";
    
    $notGiberish = mb_convert_encoding($TVrageGiberish, "HTML-ENTITIES", 'UTF-8');
    
    echo $notGiberish;
    

    哪个应该返回你想要的It’s Getting the Best of Me

    如果您正在解析某些内容,则可以在将值分配给这样的变量时执行转换,其中$TVrage 是包含所有值的数组,在此示例中是 XML 来自具有标签“Title”的提要,其中可能包含特殊‘’ 等字符。

    $cleanedTitle = mb_convert_encoding($TVrage->title, "HTML-ENTITIES", 'UTF-8');
    

    【讨论】:

      【解决方案4】:

      您应该检查编码编码来源,然后尝试转换为正确的编码类型。

      在我的例子中,我读取 csv 文件然后导入到 db。有些文件显示得很好,有些则没有。我检查了编码,发现带有 ASCII 编码的文件显示良好,其他带有 UTF-8 的文件已损坏。所以我使用以下代码来转换编码:

      if(mb_detect_encoding($content) == 'UTF-8') {
          $content = iconv("UTF-8", "ASCII//TRANSLIT", $content);
          file_put_contents($file_path, $content);
      } else {
          $content = mb_convert_encoding($content, 'UTF-8', 'UTF-8');
          file_put_contents($file_path, $content);
      }
      

      转换后我将内容推送到文件然后处理导入到数据库,现在它在前端显示良好

      【讨论】:

      • 我在 Gmail 标题中使用了 †而不是撇号。 ASCII 解决了这个问题。顺便说一句,1. charset 已设置为 UTF-8,但它不起作用。 2. mb_convert_encoding($text, "HTML-ENTITIES", 'UTF-8');原来是“’”显示在标题中。所以这个答案是我的唯一解决办法。
      【解决方案5】:

      确保您的 html 标头指定 utf8

      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      

      这通常对我有用(显然,如果内容是 utf8)。

      如果设置了content-type,则不需要转换为html实体。

      【讨论】:

      • 这一定是有史以来最棒的帖子!我将我的字符集更新为 utf-8,它立即修复了我所有的数据库驱动页面。感谢您的快速修复!
      • 这应该被接受为答案,因为它是一个全球性的解决方案。
      【解决方案6】:

      如果以上解决方案均无效:

      就我而言,我注意到单引号是一种不同风格的单引号。而不是“我的数据有一个”。注意到单引号的区别了吗?所以我简单地写了一个 str_replace 来替换它,它解决了这个问题。可能不是最优雅的解决方案,但它完成了工作。

      $string= str_replace("’","'",$string);
      

      【讨论】:

      • 功劳瞄准了所有罪魁祸首中最常见的撇号,哈哈
      【解决方案7】:

      我们成功地使用了这个:

      mb_convert_encoding($text, "HTML-ENTITIES", "ISO-8859-1");
      

      【讨论】:

      • 这解决了我的问题,因为单独的 utf8_encode 不起作用。
      【解决方案8】:

      如果一切似乎都不起作用,这可能是您最好的解决方案。

      <?php
      $content="It’s Getting the Best of Me";
      $content = str_replace("’", "&#39;", $content);
      echo $content;
      ?>
      

      ==或==

      <?php
      $content="It’s Getting the Best of Me";
      $content = str_replace("’", "'", $content);
      echo $content;
      ?>
      

      【讨论】:

        【解决方案9】:

        对于fopenfile_put_contents,这将起作用:

        str_replace("&rsquo;", "'", htmlspecialchars_decode(mb_convert_encoding($string_to_be_fixed, "HTML-ENTITIES", "UTF-8")));
        

        【讨论】:

          【解决方案10】:

          我查看了链接,对我来说它看起来像 UTF-8。即,在 Firefox 中,如果您选择查看、字符编码、UTF-8,它将正确显示。

          所以,您只需要弄清楚如何让您的 PHP 代码将其处理为 UTF-8。祝你好运!

          【讨论】:

            【解决方案11】:

            您的内容很好;问题在于服务器发送的标头:

            Connection:Keep-Alive
            Content-Length:502
            Content-Type:text/html
            Date:Thu, 18 Feb 2010 20:45:32 GMT
            Keep-Alive:timeout=1, max=25
            Server:Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.7 with Suhosin-Patch
            X-Powered-By:PHP/5.2.4-2ubuntu5.7
            

            Content-Type 应该设置为Content-type: text/plain; charset=utf-8,因为这个页面不是 HTML 并且使用 utf-8 编码。 Mac 上的 Chromium 会猜测 ISO-8859-1 并显示您所描述的字符。

            如果您无法控制该网站,请将编码指定为 UTF-8 以用于检索内容的任何函数。我对 PHP 不够熟悉,不知道具体是怎么回事。

            【讨论】:

              【解决方案12】:

              如果您因为在 WordPress 网站中遇到垃圾字符问题而来到这里,请尝试以下操作:

              1. 打开wp-config.php

              2. 注释掉define('DB_CHARSET', 'utf8')define('DB_COLLATE', '')

                /** MySQL hostname */
                define('DB_HOST', 'localhost');
                
                /** Database Charset to use in creating database tables. */
                //define('DB_CHARSET', 'utf8');
                
                /** The Database Collate type. Don't change this if in doubt. */
                //define('DB_COLLATE', '');
                

              【讨论】:

                【解决方案13】:

                听起来您正在对ISO 8859-1 中不存在的 UTF8 字符 (') 使用标准字符串函数。检查您是否使用Unicode compatible PHP 设置和功能。另请参阅multibyte 字符串函数。

                【讨论】:

                  【解决方案14】:

                  试试这个:

                  html_entity_decode(mb_convert_encoding(stripslashes($text), "HTML-ENTITIES", 'UTF-8'))
                  

                  【讨论】:

                    【解决方案15】:

                    使用这个

                    <meta http-equiv="Content-Type" content="text/html; charset=utf8_unicode_ci" />
                    

                    而不是这个

                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                    

                    【讨论】:

                      【解决方案16】:

                      如果没有任何效果,试试这个 mb_convert_encoding($elem->textContent, 'UTF-8', 'utf8mb4');

                      【讨论】:

                      • 欢迎来到 SO,您可能想提供一些关于他们为什么应该使用它的上下文
                      • 在我的情况下,它使用该代码
                      猜你喜欢
                      • 2011-04-11
                      • 2021-06-15
                      • 2011-01-29
                      • 1970-01-01
                      • 2016-01-09
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-02-17
                      相关资源
                      最近更新 更多