在PHP中得到'的替代字符’

67

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

我得到的是:

"It’s Getting the Best of Me"

应该是这样的:

"It’s Getting the Best of Me"

我正在从这个网址获取数据。


3
有时当人们使用Mac给我发即时消息或电子邮件时,我会看到这种情况。期待看到解决方案。 - Eric J.
是的,我也在 Mac 上使用 MAMP Pro 测试代码。 - Mint
4
如果这个数据来自于 MySQL 表格,这里提供的任何修复方法都不适用。 - Rick James
16个回答

92

将文本转换为 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上使其工作。 - Mint
7
如果您已经获取了所需文件的内容,那么把它作为第一个参数传递给 mb_convert_encoding() 函数。例如,$text = fgets($fp); $html = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8"); - Matthew
域名不再有效。 - mtness
在 URL 中,如果使用 HTML 实体会使得像 RSS 订阅这样的内容无法成为有效的 URL,那该怎么办呢? - Titan
@GreenGiant:我的回答只是向您展示如何将一种编码转换为另一种编码。URL(不包括域名)可以包含Unicode字符;至少现代浏览器知道如何显示它们。例如,这是一个有效的URL:http://en.wikipedia.org/wiki/。(尽管SO在wiki后面吃掉了斜杠。)因此,UTF-8通常是URL的可接受编码。但是,如果您想避免这种情况,可以尝试使用第二个参数中的“ASCII”。显然,它不支持那么多字符,因此您可能最终会得到“?”占位符。 - Matthew

33

确保你的 HTML 头部指定了 utf8

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

对我而言,通常这样做就可以了(当然,如果内容本身是utf8编码的)。

如果设置了 content-type,你就不需要将其转换为html实体。


这一定是有史以来最棒的帖子!我将字符集更新为utf-8,它立即修复了我所有基于数据库的页面。感谢您提供如此快速的解决方案! - Jamie
这应该被接受为答案,因为它是一个全局解决方案。 - Keith Petrillo

12

你的内容没问题,问题在于服务器发送的头部信息:

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不够熟悉,不知道具体如何操作。


10

我知道这个问题已经有了答案,但是在我的情况下设置元标记并没有帮助,并且选择的答案也不够清晰,所以我想提供一个更简单的答案。

为了保持简单,将字符串存储到变量中,并按照以下方式处理:

$TVrageGiberish = "It’s Getting the Best of Me";

$notGiberish = mb_convert_encoding($TVrageGiberish, "HTML-ENTITIES", 'UTF-8');

echo $notGiberish;

这应该返回你想要的内容:它正在击败我

如果你正在解析某些内容,你可以在将值赋给变量时执行转换,例如下面的代码,其中$TVrage是一个包含所有值的数组,在此示例中,这些值来自一个带有“Title”标记的XML源,其中可能包含特殊字符,如‘’

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

4

请尝试以下操作:

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

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

并且你就完成了..

4
如果您在使用WordPress网站时遇到乱码问题,可以尝试以下解决方法:
  1. Open wp-config.php

  2. Comment out define('DB_CHARSET', 'utf8') and 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', '');
    

不要在任何实际网站上这样做 - 这很有可能破坏任何现有的与主题相关的选项。此答案也无法解决问题。 - Howdy_McGee

3

如果所有方法都无效,这可能是您的最佳解决方案。

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

==or==

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

3

看起来你正在对一个在ISO 8859-1中不存在的UTF8字符(’)使用标准字符串函数。请检查你是否在使用Unicode兼容的PHP设置和函数。另外,请参考多字节字符串函数。


3

我们尝试使用以下方法来实现成功:

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

这解决了我的问题,因为仅使用utf8_encode无法正常工作。 - Roddy P. Carbonell
你是救命恩人。 - Zaheer Abbas

1
尝试一下这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接