web-dev-qa-db-ja.com

PHP出力に疑問符付きの小さな黒いひし形を表示

データベースソースからプルするphpプログラムを書いています。一部のvarcharには、疑問符の付いた黒い菱形として表示される引用符があります(�、 REPLACEMENT CHARACTER 、Microsoft Wordのテキストから推測します)。

Phpを使用してこれらの文字を削除するにはどうすればよいですか?

70

その文字(�U + FFFD "REPLACEMENT CHARACTER")が表示される場合、通常、テキスト自体は何らかの形式のシングルバイトエンコーディングでエンコードされていますが、Unicodeエンコーディング(UTF8またはUTF16)のいずれかで解釈されます。

それが他の方法であった場合、(通常)次のようになります。

おそらく元のエンコーディングは、Latin-1とも呼ばれるISO-8859-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() でテキストを変換することもできます。

68
user3850

これは文字セットの問題です。そのため、さまざまなレベルで間違っている可能性がありますが、ほとんどの場合、データベース内の文字列はutf-8でエンコードされており、iso-8859-1として表示しています。またはその逆。

この問題を修正する適切な方法は、文字セットをまっすぐにすることです。 PHPを使用しているため、最も単純な戦略は、アプリケーション全体でiso-8859-1を使用することです。これを行うには、次のことを確認する必要があります。

  • すべてのPHPソースファイルはiso-8859-1として保存されます(cp-1252と混同しないでください)。
  • ウェブサーバーは、charset=iso-8859-1でファイルを提供するように設定されています
  • または、 header を使用して、PHPドキュメント内からWebサーバー設定をオーバーライドできます。
  • さらに、HTMLにメタタグを挿入することもできます。これは同じことを指定しますが、これは厳密には必要ありません。
  • また、mayは、accept-charset要素の<form>属性も指定します。
  • データベーステーブルは、latin1としてエンコードで定義されます
  • PHP toとデータベースの間のデータベース接続はlatin1に設定されます

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

メタタグについてのメモ。誰もがその意味を誤解しているためです。

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

このページ は、これらのことについて非常に良い説明をしています。

41
troelskn

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

  1. substr()

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

  2. htmlspecialchars()

    別の問題は、UTF8文字列でhtmlspecialchars()を使用することでした。修正は以下を使用することです: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() を使用することです。

この追加情報がこのような問題を取り除くのに役立つことを願っています。

28
Kai Noack

前の回答で述べたように、テキストはiso-8859-1エンコーディングまたはその他の形式でデータベースに書き込まれているために発生しています。

したがって、出力する前にデータをutf8に変換するだけです。

$text = “string from database”;
$text = utf8_encode($text);
echo $text;
9
Hamlet Kraskian

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

8
ptwiggerl

問題の説明に基づいて、データベース内のデータはほぼ確実に Windows-1252 としてエンコードされ、ページはほぼ確実に ISO-8859-1 として提供されます。これらの2つの文字セットは同等です。ただし、Windows-1252には16の余分な文字があり、ISO-8859-1には存在しません。左および右中引用符が含まれます。

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

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

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

6
Daniel Cassidy

これを行うことで、文字列からこれらの文字を取り除くことにしました-

ini_set('mbstring.substitute_character', "none"); 
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
3
DropHit

これを試してください

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

3
Vishal P Gothi

この関数を変数に追加しますutf8_encode($ your variable);

3
rk_programmer

ページの先頭からこのコードを貼り付けてください。

<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
1
Harshil Kaneria

これらの行をヘッダーの前に追加してください。

.doc/docxファイルの正確な形式が取得されます:

 if(ini_get('zlib.output_compression'))

   ini_set('zlib.output_compression', 'Off');
 ob_clean();
1
asma

テーブルを修正した後、最後にやったことは、それをバックアップして設定をutf-8に戻し、ダンプファイルを変更してDEFAULT CHARACTER SET utf8 COLLATE utf8_general_ciが私のキャラクターセットエントリになるようにすることでした

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

何が原因であるかがわかりました。これは、Webページ+ DBに対するブラウザ効果です。 Linux(ubuntu + firefox)の端末では、データベースがlatin1でエンコードされていました。これがタブの設定です。しかし、Windows 10 + Edgeターミナルでは、エントリはutf8に強制的にコーディングされていました。また、windows 10にはlatin1にとどまる問題があることに気づいたので、風で曲げてすべてをutf8に変換することにしました。

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

1
drtechno

これはあなたを助けます。これを<head>タグ内に配置します

<meta charset="iso-8859-1">
1
Prasant Kumar

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

1
che

データベースとHTMLの両方で同じ文字セット(ここで推奨)を使用してもうまくいきませんでした...コードがHTMLとして生成されることを思い出して、&quot;(HTMLコード)または&#34;(ISO Latin-1コード)引用符が使用されたデータベーステキスト内。これにより、引用符を付けて問題を解決しました。このソリューションの前は、一部の引用符とアポストロフィだけが正しく表示されなかったのに、特別なコードがすべてのインスタンスで機能したことに注意してください。

0
GrafixGuy

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>";
        }

        ?>        
0
drtechno

ブラウザで文字セットを変更することもできます。デバッグのためだけに。

0
powtac

どこからでもデータを抽出するときは、接頭辞md_FUNC_NAMEが付いた関数を使用する必要があります。

同じ問題を抱えて助けてくれました。

または、このシンボルのコードを見つけ、regexpを使用してこれらのシンボルを削除できます。

0
Skylark Roman

私の場合、これはたまたま動作しました:

$text = utf8_decode($text)

ブラックダイヤモンド文字を疑問符に変えて、次のことができるようにします。

$text = str_replace('?', '', utf8_decode($text));
0
JacobRossDev

グローバルな目的のため。

各テキストを変換、コード化、コード化する代わりに、それらをそのままにしてサーバーPHPの設定を変更することを好みます。そう、

  1. ダイヤモンドをしましょう
  2. ブラウザの表示メニューで「テキストエンコーディング」を選択し、テキストを正しく表示できるものを見つけます。
  3. Php.iniを編集して追加します:

    default_charset = "ISO-8859-1"

または、テキストエンコーディングに適合するISO-8859の代わりに。

0
vivoconunxino