【问题标题】:Strange â character in curl dom utf8 htmlspecialchars not workingcurl dom utf8 htmlspecialchars中的奇怪â字符不起作用
【发布时间】:2018-01-20 04:36:20
【问题描述】:

我在 curl 请求中出现了一个奇怪的字符 â 而不是引号和双引号

  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');

我正在使用 php domelement 来操作结果

$fulltext = $doc->getElementsByTagName('p');
foreach($fulltext as $para) {
  $fulltextstr .= $para->textContent;
}

除了引号和双引号被替换为 â 之外,它大部分都有效,我该如何替换它。

我试过了

echo htmlspecialchars($fulltextstr,ENT_SUBSTITUTE,'UTF-8');

但这不会删除字符,有没有办法通过替换或者如果不可能,然后删除这些字符来清理输出!?

获取此链接时遇到此问题: https://www.dissentmagazine.org/article/coping-economy-mindfulness-goes-corporate

更多详情

我在元标题中设置了 utf-8,我正在使用

mb_regex_encoding('UTF-8');
mb_internal_encoding('UTF-8'); 

网站标头设置为 UTF-8:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

我还能做什么?!

【问题讨论】:

  • 你用什么来显示你的 PHP 输出?可能是您的浏览器获取了不正确的编码标头,或者您的终端使用了错误的编码。该字符(我相信)是一个 UTF-8 字符。
  • 我已经用 utf8 设置更新了问题。有什么我想念的吗?!

标签: php curl utf-8


【解决方案1】:

字符被检测为 UTF-8 并且看起来很好,但我看到的问题与您描述的类似。
虽然这不是一个完美的答案,但它是一种变通方法。

您可以在使用字符串之前简单地替换这些字符(和其他特定字符)。

str_replace(
    [
        "\xe2\x80\x98", 
        "\xe2\x80\x99", 
        "\xe2\x80\x9c", 
        "\xe2\x80\x9d", 
        "\xe2\x80\x93", 
        "\xe2\x80\x94", 
        "\xe2\x80\xa6"
    ], 
    [
        "'", 
        "'", 
        '"', 
        '"', 
        '-', 
        '--', 
        '...'
    ], 
    $text
);

这会将左右引号替换为仅一个引号,左右双引号仅替换为双引号,以及连字符、破折号和椭圆字符与匹配的符号。

【讨论】:

  • 谢谢,我希望有更好的方法,但必须这样做。
  • 它似乎不起作用。它没有在字符串中找到这些字符代码。我尝试使用单独的代码,但它们与字符串中的字符不匹配。关于替代品或如何找到实际字符代码的任何想法?
  • 好的,我找到了一些东西,utf8_decode 修复了输出,但这意味着我的网站没有使用 utf8 .. 我如何找到这个.. utf8_decode 的问题是它替换了  用黑色?菱形字符。
  • 我发现该字符串被附加到一个 ASCII 字符串中,这使得输出为 ASCII。我仍然必须在原始 utf8 字符串上使用 utf8_decode 来清理输出,但这很奇怪,因为它应该正确显示。
【解决方案2】:

我使用以下内容对其进行了修补,这会产生干净的输出,第一行是删除显示为黑色菱形问号的“&nbsp”字符。

$str = str_replace("\xc2\xa0",' ',$str);
$str = utf8_decode($str);

这不是一个强大的解决方案,因为我希望原始 utf8 能够正确显示,但发现如果我必须使用 utf8_decode 那么我的网站不是正确的 utf8...我该如何解决这个问题?!我在标题元中设置了 utf8,我使用了 mb_regex_encoding('UTF-8') 和 mb_internal_encoding('UTF-8') 并且数据库也是 utf8,我还缺少什么?!

【讨论】:

  • ...你不是在问一个新问题吗?这不是带有巨大标签“您的答案”的框的用途。
  • 是的。它是我正在使用的解决方案,希望有人能告诉我一个更好的解决方案。我发现该站点是 utf8,但该字符串在输出之前被附加到 ASCII 字符串中。我仍然不得不使用 utf8_decode 来清理原始的 utf8 字符串,尽管这很令人困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2011-04-07
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多