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

私もこの問題に直面しました。その間、私はそれが起こった3つのケースに遭遇しました:

  1. substr()

    substr()UTF8 文字をカットする UTF8 文字列を使用していたため、カットされた文字が正しく表示されませんでした。mb_substr($utfstring, 0, 10, 'utf-8');代わりに使用してください。クレジット

  2. htmlspecialchars()

    もう 1 つの問題は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 を使用して、PHP ドキュメント内から Web サーバーの設定をオーバーライドできますheader
  • さらに、同じことを指定するメタタグを HTML に挿入することもできますが、これは厳密には必要ありません
  • 要素に属性を指定することもできます。accept-charset<form>
  • データベース テーブルは、latin1 としてエンコーディングで定義されます
  • PHP とデータベース間のデータベース接続は latin1 に設定されています。

データベースに既にデータがある場合、それらはおそらくすでにめちゃくちゃになっていることに注意してください。まだ本番段階にない場合は、すべてを消去して最初からやり直してください。それ以外の場合は、データのクリーンアップを行う必要があります。

誰もがメタタグが何であるかを誤解しているため、メタタグに関する注意:

Web サーバーがファイル (HTML ドキュメント) を提供するとき、ブラウザーに直接表示されない情報を送信します。これは、HTTP ヘッダーとして知られています。そのようなヘッダーの 1 つContent-Typeは、ファイルの MIME タイプ (例: text/html) とエンコーディング (別名 charset) を指定するヘッダーです。ほとんどの Web サーバーは情報を含むContent-Typeヘッダーを送信しますがcharset、これはオプションです。存在しない場合、ブラウザは代わりにメタタグを解釈しhttp-equiv="Content-Type"ます. メタタグは、Web サーバーがヘッダーを送信しない場合にのみ解釈されることに注意してください。実際には、これは、ページがディスクに保存され、そこから開かれる場合にのみ使用されることを意味します。

このページには、これらのことについて非常に適切な説明があります。

于 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 に答える
5

問題の説明に基づいて、データベース内のデータはほぼ確実にWindows-1252としてエンコードされており、ページはほぼ確実にISO-8859-1として提供されています。Windows-1252 には、ISO-8859-1 には存在しない 16 個の余分な文字 (左右のカーリー クォーテーションを含む) があることを除いて、これら 2 つの文字セットは同等です。

私の分析が正しいと仮定すると、最も簡単な解決策は、ページを Windows-1252 として提供することです。ISO-8859-1 にあるすべての文字は Windows-1252 にもあるため、これは機能します。PHP では、次のようにエンコーディングを変更できます。

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

ただし、HTML ファイルとデータベースのコンテンツで使用している文字エンコーディングを確認し、一貫性を保つように注意するか、それが不可能な場合は適切に変換する必要があります。

于 2008-11-09T01:19:08.033 に答える
1

テーブルを修正した後に最終的に行ったことは、それをバックアップして設定をutf-8に戻すことでした。次に、ダンプファイルを変更して、DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ciが文字セットエントリになるようにしました

データベースとブラウザーが utf8 であるため、文字セットの問題はもうありません。

何が原因か分かりました。それは、DBに対するWebページ+ブラウザの影響でした。Linux(ubuntu + firefox)の端末では、データベースがlatin1でエンコードされていました。これは、タブが設定されているものです。しかし、Windows 10+edge 端末では、エントリは強制的に utf8 にコーディングされていました。また、windows 10 には latin1 のままで問題があることに気付いたので、風に乗ってすべてを utf8 に変換することにしました。

win10端末を使い始めたので、windows10の問題だと思いました。そのため、マイクロソフトのバグが問題を引き起こします。Windows 10のブラウザーはlatin1文字セットを表示するため、フォームのエンコーディングが変更される理由はまだわかりませんが、utf8でエンコードされ、データ異常が発生します。しかし、linux+firefox ではそれができません。

于 2016-09-07T15:30:39.787 に答える
1

これは、Unicode またはその他の文字セットの不一致が原因である可能性があります。ブラウザで文字セットを変更してみてください。設定の中で、テキストは問題なく表示されます。次に、データベースの内容を表示に使用する文字セットに変換する方法の問題です。(実際には、出力に utf-8 charset ステートメントを追加するだけです。)

于 2008-11-09T00:26:31.010 に答える
1

これは私の場合にうまくいきました:

$text = utf8_decode($text)

黒いひし形の文字を疑問符に変えて、次のことができるようにします。

$text = str_replace('?', '', utf8_decode($text));
于 2017-01-03T20:03:09.437 に答える
0

ブラウザに設定されている文字を変更することもできます。デバッグ上の理由からです。

于 2008-11-09T11:05:13.547 に答える
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 に答える