86

我正在编写一个从数据库源中提取的 php 程序。一些 varchars 的引号显示为带有问号的黑色菱形(�,REPLACEMENT CHARACTER,我假设来自 Microsoft Word 文本)。

如何使用 php 去除这些字符?

4

21 回答 21

79

如果您看到该字符(� U+FFFD "REPLACEMENT CHARACTER"),通常意味着文本本身以某种形式的单字节编码进行编码,但以其中一种 unicode 编码(UTF8 或 UTF16)进行解释。

如果它是相反的方式,它(通常)看起来像这样:ä。

可能原始编码是 ISO-8859-1,也称为 Latin-1。您可以在不更改脚本的情况下检查这一点:浏览器为您提供了以不同编码重新解释页面的选项——在 Firefox 中使用“视图”->“字符编码”。

要使浏览器使用正确的编码,请添加如下 HTTP 标头:

header("Content-Type: text/html; charset=ISO-8859-1");

或将编码放在元标记中:

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

或者,您可以尝试以另一种编码(最好是 UTF-8)从数据库中读取或使用iconv().

于 2008-11-09T00:51:36.187 回答
45

我也遇到过这个问题。与此同时,我遇到了三种情况:

  1. substr()

    我正在使用substr()一个 UTF8 字符串来剪切 UTF8 字符,因此剪切的字符无法正确显示。改为使用mb_substr($utfstring, 0, 10, 'utf-8');学分

  2. htmlspecialchars()

    另一个问题是htmlspecialchars()在 UTF8 字符串上使用。解决方法是使用:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. preg_replace()

    最后我发现这preg_replace()可能会导致 UTF 出现问题。例如,代码$string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);将 UTF 字符串“F(×)=2×-3”转换为“F � 2�”。解决方法是mb_ereg_replace()改用。

我希望这些额外的信息将有助于摆脱这些问题。

于 2013-02-28T14:35:00.553 回答
41

这是一个字符集问题。因此,它可能在许多不同的级别上出错,但最有可能的是,数据库中的字符串是 utf-8 编码的,并且您将它们呈现为 iso-8859-1。或者反过来。

解决此问题的正确方法是正确设置字符集。由于您使用的是 PHP,因此最简单的策略是在整个应用程序中使用 iso-8859-1。为此,您必须确保:

  • 所有 PHP 源文件都保存为 iso-8859-1(不要与 cp-1252 混淆)。
  • 您的网络服务器配置为提供文件charset=iso-8859-1
  • 或者,您可以覆盖 PHP 文档中的网络服务器设置,使用header.
  • 此外,您可以在 HTML 中插入一个元标记,指定相同的内容,但这不是严格需要的。
  • 还可以在元素上指定accept-charset属性。<form>
  • 数据库表定义为 latin1 编码
  • PHP to和数据库之间的数据库连接设置为latin1

如果您的数据库中已经有数据,您应该知道它们可能已经搞砸了。如果您尚未处于生产阶段,只需将其全部擦除并重新开始。否则你将不得不做一些数据清理。

关于元标签的注释,因为每个人都误解了它们是什么:

当网络服务器提供文件(HTML 文档)时,它会发送一些信息,这些信息不会直接显示在浏览器中。这称为 HTTP 标头。一个这样的标头是Content-Type标头,它指定文件的 mimetype(例如text/html)以及编码(又名字符集)。虽然大多数网络服务器会发送Content-Type带有charset信息的标头,但它是可选的。如果它不存在,浏览器将改为解释任何带有http-equiv="Content-Type". 重要的是要意识到元标记在网络服务器不发送标头时才被解释。实际上,这意味着它仅在页面保存到磁盘然后从那里打开时才使用。

这个页面对这些事情有很好的解释。

于 2008-11-09T00:52:00.913 回答
13

正如前面的答案中提到的,这是因为您的文本已以iso-8859-1编码或任何其他格式写入数据库。

所以你只需要utf8在输出之前将数据转换为。

$text = “string from database”;
$text = utf8_encode($text);
echo $text;
于 2015-08-16T16:28:16.107 回答
12

为确保您的 MYSQL 连接设置为 UTF-8(或 latin1,具体取决于您使用的内容),您可以执行以下操作:

$con = mysql_connect("localhost","username","password");    
mysql_set_charset('utf8',$con);

或使用它来检查您使用的字符集:

$con = mysql_connect("localhost","username","password");   
$charset = mysql_client_encoding($con);
echo "The current character set is: $charset\n"; 

更多信息在这里: http: //php.net/manual/en/function.mysql-set-charset.php

于 2012-04-05T06:28:58.547 回答
6

只需将此代码粘贴到页面顶部即可。

<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
于 2019-05-06T16:47:59.743 回答
5

根据您对问题的描述,您的数据库中的数据几乎肯定被编码为Windows-1252,并且您的页面几乎肯定被提供为ISO-8859-1。这两个字符集是等效的,只是 Windows-1252 有 16 个额外的字符,这些字符在 ISO-8859-1 中不存在,包括左弯引号和右弯引号。

假设我的分析是正确的,最简单的解决方案是将您的页面作为 Windows-1252 提供。这将起作用,因为 ISO-8859-1 中的所有字符也在 Windows-1252 中。在 PHP 中,您可以按如下方式更改编码:

header('Content-Type: text/html; charset=Windows-1252');

但是,您确实应该检查您在 HTML 文件中使用的字符编码和数据库的内容,并注意保持一致,或者在不可能的情况下正确转换。

于 2008-11-09T01:19:08.033 回答
5

我选择通过这样做从字符串中删除这些字符 -

ini_set('mbstring.substitute_character', "none"); 
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
于 2015-07-29T02:41:24.290 回答
4

将此函数添加到您的变量 utf8_encode($your variable);

于 2017-01-17T11:16:58.327 回答
3

这将对您有所帮助。把这个放在<head>标签里面

<meta charset="iso-8859-1">
于 2017-10-08T17:21:19.010 回答
3

请试试这个

mb_substr($description, 0, 490, "UTF-8");

于 2016-10-06T07:58:36.787 回答
1

这可能是由 unicode 或其他字符集不匹配引起的。尝试在浏览器中更改字符集,在设置中文本看起来不错。然后是如何将数据库内容转换为用于显示的字符集的问题。(实际上可以只是将 utf-8 字符集语句添加到您的输出中。)

于 2008-11-09T00:26:31.010 回答
1

这恰好在我的情况下起作用:

$text = utf8_decode($text)

我将黑色菱形字符变成问号,以便您可以:

$text = str_replace('?', '', utf8_decode($text));
于 2017-01-03T20:03:09.437 回答
1

在我修复我的表之后我最终做的是备份它并将设置更改回 utf-8 然后我更改了我的转储文件,以便默认字符集 utf8 排序 utf8_general_ci 是我的字符集条目

现在我没有字符集问题了,因为数据库和浏览器是 utf8。

我弄清楚是什么原因造成的。这是对数据库的网页+浏览器效果。在 linux (ubuntu+firefox) 的终端上,它在 latin1 中对数据库进行编码,这就是 tabes 的设置。但在 windows 10+edge 终端上,条目被强制编码为 utf8。此外,我注意到 Windows 10 存在与 latin1 保持一致的问题,因此我决定随风而行,将所有内容都转换为 utf8。

我认为这是 Windows 10 的问题,因为我们开始使用 win 10 终端。所以微软的错误再次导致问题。我仍然不知道为什么表单上的编码会发生变化,因为 Windows 10 中的浏览器显示 latin1 字符集,但是当它进入 utf8 编码时,我得到数据异常。但在 linux+firefox 中它不会那样做。

于 2016-09-07T15:30:39.787 回答
1

只需在标题之前添加这些行。

.doc/docx将检索文件的准确格式:

 if(ini_get('zlib.output_compression'))

   ini_set('zlib.output_compression', 'Off');
 ob_clean();
于 2017-03-15T05:13:03.417 回答
1

当您从任何地方提取数据时,您应该使用带有前缀的函数md_FUNC_NAME

有同样的问题,它帮助了我。

或者您可以找到该符号的代码并使用正则表达式删除这些符号。

于 2017-06-07T10:25:02.080 回答
0

您还可以更改浏览器中的字符集。只是出于调试原因。

于 2008-11-09T11:05:13.547 回答
0

在数据库和 HTML 中使用相同的字符集(如这里所建议的)对我来说不起作用......所以记住代码是作为 HTML 生成的,我选择使用&quot;(HTML code) 或&#34;(ISO Latin-1代码)在我的数据库文本中使用引号。这解决了问题,同时为我提供了一个引号。奇怪的是,在此解决方案之前,只有一些引号和撇号没有正确显示,而另一些则显示正确,但是,特殊代码在所有情况下都有效。

于 2014-06-22T15:12:11.977 回答
0

我在 phpmyadmin 中的排序规则更改后运行了“检测编码”代码,现在它显示为 Latin_1。

但这是我在我的应用程序中发现不同的数据异常以及我如何修复它时遇到的问题:

我刚刚导入了一个混合编码的表(在某些行中带有菱形问号,并且都在同一列中。)所以这是我的修复代码。我使用了 utf8_decode 过程,它采用未定义的占位符并在“菱形问号”的位置分配一个普通的问号,然后我使用 str_replace 用引号之间的空格替换问号。这是[代码]

    include 'dbconnectfile.php';

  //// the variable $db comes from my db connect file
   /// inx is my auto increment column
   /// broke_column is the column I need to fix

      $qwy = "select inx,broke_column from Table ";
      $res = $db->query($qwy); 

      while ($data = $res->fetch_row()) {
      for ($m=0; $m<$res->field_count; $m++) {
           if ($m==0){ 
           $id=0;
           $id=$data[$m];
       echo $id;
           }else if ($m==1){ 
             $fix=0;
             $fix=$data[$m];


             $fix = utf8_decode($fix);
             $fixx =str_replace("?"," ",$fix);

        echo $fixx;

        ////I echoed the data to the screen because I like to see something as I execute it :)
            }
            }
         $insert= "UPDATE Table SET broke_column='".$fixx."'  where inx='".$id."'";
          $insresult= $db->query($insert);
      echo"<br>";
        }

        ?>        
于 2016-09-05T22:26:50.043 回答
0

出于全球目的。

而不是转换、编码、解码每个文本,我更喜欢让它们保持原样,而是更改服务器 php 设置。所以,

  1. 让钻石

  2. 在浏览器中,在视图菜单上选择“文本编码”并找到可以让您正确查看文本的那个。

  3. 编辑您的 php.ini 并添加:

    default_charset = "ISO-8859-1"

或者代替 ISO-8859 适合您的文本编码的一种。

于 2017-03-24T13:42:07.183 回答
-3

转到您的 phpmyadmin 并选择您的数据库,只需将该表字段的长度/值增加到 500 或 1000 即可解决您的问题。

于 2017-08-26T16:31:29.383 回答