疑問符の付いた小さな黒いひし形を示すPHP出力


81

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

どうすればphpを使用してこれらの文字を取り除くことができますか?


1
それらを剥がさないで、時間を修正してください。また、「黒いダイヤ」で参照してくださいstackoverflow.com/questions/38363566/...
リック・ジェームズ

回答:


75

その文字( 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()。で変換することもできます。


これまでのところ、これが最も近い解決策です。しかし、今私はメタを持っています:<meta http-equiv = "Content-Type" content = "text / html; charset = UTF-8">そして私はiconvを使ってiso-8859-1からutf-に変換しています8、文字は0096と0092のrespectivleyスペシャル( 'または-)のボックスとして表示されます他の考えはありますか?

はい、私は別の考えを持っています:いくつかの宿題をしてください...あなたはおそらく間違ったソースエンコーディングを使用しました。0x92と0x96は、windows-1252では「曲線の一重引用符」と「ダッシュ」です。それは正しいものでしょうか?ブラウザトリックを試しましたか?

PHPヘッダーは、PDF2Textクラスを使用する際の問題を修正しました。
James P.

すべきではheader("Content-Type: text/plain; charset=ISO-8859-1");ないheader("Content-Type: text/html; charset=ISO-8859-1");
j08691 2015年

@ j08691:ええと、それは今のコンテンツの種類に依存しますね。

41

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

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

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

データベースにすでにデータがある場合は、それらがすでに混乱している可能性があることに注意する必要があります。まだ生産段階にない場合は、すべてを拭いて最初からやり直してください。それ以外の場合は、データのクリーンアップを行う必要があります。

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

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

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


38

私もこの問題に直面しました。その間、私はそれが起こった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()代わりに使用することです。

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


2
それはまさに私が直面していた問題でした。mb文字列関数について知りませんでした。
レン

1
それはstrtolower機能のためにも起こりました。関係するすべての関数PHPマニュアル
micaball

13

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

したがって、出力するutf8前にデータをに変換する必要があります。

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

11

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


これは非常に便利で、リモートMySQLデータベースからのデータの見積もりエンコーディングの問題を解決しました。ありがとうございます。
苦難

@ptwiggerlこれは大いに役立ちました。
unixmiah 2016

Webサイトを別のサーバーに移行しましたが、この問題に直面しました。mysql_set_charset( 'utf8'、$ con); 解決しました!
ラファエルモニ

5

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

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

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

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


この提案の問題は、この時点でデータが異なる文字セットの混合である可能性が高いことです。何が悪かったのか正確にわからない場合は、あちこちでランダムな修正をいくつか投げると、さらに厄介になります。
troelskn 2008年

同意する。この解決策はあなたが何をしているのかを知ることに代わるものではないことを反映するために、私は自分の投稿をいくらか編集しました。ただし、ほとんどの開発者はこの問題を理解できないか、気にしないという結論に達しました。私が働いているところは、少なくとも月に一度は出てくるようです。
ダニエルキャシディ

それは私の観察でもあります。私が気にかけていることのために、彼らは種をまくときに刈り取ります。しかし、あなたはおそらく正しいでしょう。彼のデータは確かにcp-1252である可能性があります..少なくともその一部はそうです。
troelskn 2008年

私は同じ問題に対してたくさんの解決策を試しました。この1は、少なくとも努力ですぐに効果があった
sixstring

4

私はこれを行うことによって文字列からこれらの文字を取り除くことを選択しました-

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

1
これはすごいです、それは私のために働きました、utf8_encodeを試しました、そしてut8_decodeも-働きませんでした。しかし、私の場合、このソリューションは機能しました。ありがとうございました。
sanjeevshetty20年

4

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


この答えについて詳しく説明してください。
ppovoski 2017年

1
これは、あなたがあなたの文字のUTF8標準の特殊文字とリターンを削除することができる機能です google.com/...を
rk_programmer

これは、正しく表示されなかった分数で機能しました。
Rogメール

私の意見では、これらは受け入れられた答えでなければなりません。これが私のために働いた唯一の方法です、私はそれのすべてを試しました。
quantme

4

このコードをページの先頭から貼り付けるだけです。

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

コードの機能の簡単な説明を含めてください。
CTホール

1
「ISO-8859-1」の文字セットを許可するこのphpコードと、この文字セットでは、この記号 が文字として表示されます。
HarshilKaneria19年



1

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


1

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

データベースとブラウザがutf8であるため、文字セットの問題は発生しなくなりました。

私はそれを引き起こした原因を理解しました。これは、DBに対するWebページとブラウザの影響でした。Linux(ubuntu + firefox)である端末では、タブが設定されているlatin1でデータベースをエンコードしていました。しかし、Windows 10 + Edgeターミナルでは、エントリはutf8に強制的にコード化されていました。また、Windows 10でlatin1を維持する際に問題が発生することに気付いたので、風で曲がってすべてをutf8に変換することにしました。

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


1

私の場合、これはたまたまうまくいきました。

$text = utf8_decode($text)

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

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

1
$text = セクションに関する警告:これにより、ひし形だけでなく、文字列内のすべての疑問符が変更されます
treyBake 2018

1

ヘッダーの前にこれらの行を追加するだけです。

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

 if(ini_get('zlib.output_compression'))

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

0

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


0

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


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

        ?>        

上記のコードは私のテーブルを修正します。ただし、問題が修正されるかどうかを最初に確認できるように、更新ステートメントにコメントを付けることをお勧めします。
drtechno 2016

0

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

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

  1. ダイヤモンドをしましょう

  2. ブラウザから、表示メニューで「テキストエンコーディング」を選択し、テキストを正しく表示できるものを見つけます。

  3. php.iniを編集して、以下を追加します。

    default_charset = "ISO-8859-1"

またはISO-8859の代わりにあなたのテキストエンコーディングに合うもの。


0

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

同じ問題があり、それは私を助けました。

または、このシンボルのコードを見つけて、正規表現を使用してこれらのシンボルを削除することもできます。


-2

phpmyadminに移動してデータベースを選択し、そのテーブルのフィールドの長さ/値を500または1000に増やすだけで、問題が解決します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.