【问题标题】:What is this character ( Â ) and how do I remove it with PHP?这个字符 ( Â ) 是什么,如何使用 PHP 删除它?
【发布时间】:2011-08-25 07:27:06
【问题描述】:

这是一个大写字母 A,顶部有一个 ^:Â

它显示在从网页中提取的字符串中。它显示了原始站点上原始字符串中先前存在空白的位置。这是存储在我的数据库中的实际字符。当我回显包含它的字符串时,它也会显示在我的网站上。

当我最初处理网页时,我意识到这是一个字符编码问题,但我现在在我的数据库中遇到了这些字符。我必须在显示这个字符时转换它,或者在输出包含它的 html 之前在 php 中的其他地方转换它。我无法重新处理原始文件。

我试过 str_replace() 和 html_entity_decode() 都没有做任何事情。

我还应该尝试什么?

【问题讨论】:

标签: php string character-encoding


【解决方案1】:

“Latin 1”是你的问题。大约有 65256 个 UTF-8 字符可用于网页,您无法将其存储在 Latin-1 代码页中。

对于你眼前的问题,你应该能够

$clean = str_replace(chr(194)," ",$dirty)

但是我会尽快将您的数据库切换为使用 utf-8,因为该问题几乎肯定会再次发生。

【讨论】:

  • Unicode 代码空间上升到 U+10FFFF,所以这大约是一百万个代码点,给或取一些非法代码点。
  • 这里有一个有用的图表来引用这样的字符:ascii-code.com
  • @Ignacio -- 非常正确 -- 我将自己限制在 UTF-16 字符集。 :-}
  • UTF-16 的字符数相同。您可能指的是 UCS-2。
  • 感谢这个技巧,如果有人会搜索解决方案如何将 Latin-1 文本从 SQL Server 打印到 wordpress 这里是 str_replace(chr(194)," ",mb_convert_encoding($ val, 'UTF-8', 'ISO-8859-1'));
【解决方案2】:

这对我有用:

$string = "Sentence ‘not-critical’ and \n sorting ‘not-critical’ or this \r and some ‘not-critical’ more. ' ! -.";
$output = preg_replace('/[^(\x20-\x7F)\x0A\x0D]*/','', $string);

【讨论】:

  • 我的文本中现在缺少一些空格,但编码的字符已经消失。
  • 这是我唯一摆脱 char 的答案。
【解决方案3】:

这是来自数据库,因此最好的选择是使用 SQL 查询从数据库中删除,例如:

UPDATE products SET description = REPLACE(description, 'Â', ' ');

【讨论】:

    【解决方案4】:

    它不是一个真正的字符,可能是由于内容编码和浏览器编码之间的不一致造成的。尝试将输出页面的编码设置为您正在使用的编码。

    例如在该部分中,输出:

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

    (将 UTF-8 调整为您使用的任何内容)

    【讨论】:

    • +1 - 这是一个需要解决根本原因的问题(尽管仅更改标题可能不会完全解决问题,具体取决于具体情况)
    • 这是存储在我的数据库中的实际字符。这会改变现状吗?我的数据库编码是拉丁语 1(默认)。我对编码问题不是很熟悉。
    • 哦,是的,对不起,我没有仔细阅读问题。在这种情况下,从另一个站点提取数据后,您需要检测其编码并将其转换为数据库的编码,然后再存储它们。通常它是通过像我给出的那样解析标题来完成的,但是根据您抓取的站点,它可能会变得复杂。
    • 这听起来像是解决问题的正确方法。当我回到项目的那个部分时,我会做出改变。在输出字符之前使用PHP的临时解决方案有什么建议,还是不可能?
    【解决方案5】:

    我经常用这个

    function cleanStr($value){
        $value = str_replace('Â', '', $value);
        $value = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $value);
        return $value;
    }
    

    【讨论】:

    • 英镑等于磅
    【解决方案6】:

    使用波纹管代码

    echo "<META http-equiv='Content-Type' content='text/html; charset=UTF-8'>";
    echo htmlspecialchars_decode($your_string, ENT_QUOTES);
    

    【讨论】:

      【解决方案7】:

      在您的网络中使用不同的字符集时会出现此问题。

      要解决这个问题(在示例中使用 utf-8):

      在您页面的&lt;HEAD&gt; 中添加charset

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

      在您提交的任何表格中添加accept-charset:

      <form name="..." method=".." id=".."  accept-charset="utf-8">
      

      如果您使用 php+MySQLi 来处理您的表单,您应该确保数据库连接也支持您的字符集。程序风格:

      mysqli_set_charset($link, "utf8");
      

      和面向对象的风格:

      $mysqli->set_charset("utf8")
      

      【讨论】:

        【解决方案8】:

        我实际上必须拥有所有这些:

            <--!DOCTYPE html--> 
            <--html lang="en-US"-->
            <--head-->
            <--meta charset="utf-8"-->   
            <--meta http-equiv="X-UA-Compatible" content="IE=edge"--> 
            <--meta name="viewport" content="width=device-width, initial-scale=1"--> 
            <--meta http-equiv="Content-Type" content="text/html; charset=utf-8/" /--> 
        

        【讨论】:

          【解决方案9】:

          从字符串中删除 â 字符

          mysqli_set_charset($con,"utf8");

          $price = "₹ 250.00";

          $price2 = preg_replace('/[^(\x20-\x7F)]*/','', $price);

          结果:250.00

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-14
            • 1970-01-01
            • 2011-11-05
            • 1970-01-01
            • 2015-10-30
            • 2021-12-16
            • 2011-06-13
            • 2017-08-18
            相关资源
            最近更新 更多