私はデータベースソースからプルするphpプログラムを書いています。一部のvarcharには、疑問符が付いた黒いひし形として表示されている引用符があります( 、REPLACEMENT CHARACTER、Microsoft Wordのテキストから推測します)。
どうすればphpを使用してこれらの文字を取り除くことができますか?
私はデータベースソースからプルするphpプログラムを書いています。一部のvarcharには、疑問符が付いた黒いひし形として表示されている引用符があります( 、REPLACEMENT CHARACTER、Microsoft Wordのテキストから推測します)。
どうすればphpを使用してこれらの文字を取り除くことができますか?
回答:
その文字( 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()
。で変換することもできます。
header("Content-Type: text/plain; charset=ISO-8859-1");
ないheader("Content-Type: text/html; charset=ISO-8859-1");
?
これは文字セットの問題です。そのため、さまざまなレベルで問題が発生した可能性がありますが、データベース内の文字列はutf-8でエンコードされており、iso-8859-1として表示されている可能性があります。またはその逆。
この問題を修正する適切な方法は、文字セットをまっすぐにすることです。PHPを使用しているため、最も簡単な戦略は、アプリケーション全体でiso-8859-1を使用することです。これを行うには、次のことを確認する必要があります。
charset=iso-8859-1
header
。accept-charset
ます<form>
要素に。データベースにすでにデータがある場合は、それらがすでに混乱している可能性があることに注意する必要があります。まだ生産段階にない場合は、すべてを拭いて最初からやり直してください。それ以外の場合は、データのクリーンアップを行う必要があります。
Webサーバーがファイル(HTMLドキュメント)を提供するとき、ブラウザーに直接表示されない情報を送信します。これはHTTPヘッダーとして知られています。そのようなヘッダーの1つContent-Type
は、ファイルのmimetype(例text/html
)とエンコーディング(別名charset)を指定するヘッダーです。ほとんどのウェブサーバーは情報を含むContent-Type
ヘッダーを送信しますがcharset
、それはオプションです。存在しない場合、ブラウザは代わりにhttp-equiv="Content-Type"
。を使用してメタタグを解釈します。メタタグは、Webサーバーがヘッダーを送信しない場合にのみ解釈されることを理解することが重要です。実際には、これは、ページがディスクに保存され、そこから開かれた場合にのみ使用されることを意味します。
このページには、これらのことについての非常に良い説明があります。
私もこの問題に直面しました。その間、私はそれが起こった3つのケースに遭遇しました:
substr()
substr()
UTF8文字をカットするUTF8文字列を使用していたため、カット文字を正しく表示できませんでした。mb_substr($utfstring, 0, 10, 'utf-8');
代わりに使用してください。クレジット
htmlspecialchars()
もう1つの問題はhtmlspecialchars()
、UTF8文字列での使用でした。修正は次を使用することです:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');
preg_replace()
最後に、それpreg_replace()
がUTFの問題につながる可能性があることを発見しました。$string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);
たとえば、コードはUTF文字列「F(×)= 2×-3」を「F 2 」に変換しました。修正はmb_ereg_replace()
代わりに使用することです。
この追加情報がそのような問題を取り除くのに役立つことを願っています。
以前の回答で述べたように、これは、テキストがiso-8859-1
エンコーディングまたはその他の形式でデータベースに書き込まれているために発生しています。
したがって、出力するutf8
前にデータをに変換する必要があります。
$text = “string from database”;
$text = utf8_encode($text);
echo $text;
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
問題の説明に基づくと、データベース内のデータはほぼ確実に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ファイルとデータベースのコンテンツで使用している文字エンコードを実際に確認し、一貫性を保つように注意するか、これが不可能な場合は適切に変換する必要があります。
私はこれを行うことによって文字列からこれらの文字を取り除くことを選択しました-
ini_set('mbstring.substitute_character', "none");
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
この関数を変数に追加しますutf8_encode($ your variable);
このコードをページの先頭から貼り付けるだけです。
<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
これを試してください
mb_substr($ description、0、490、 "UTF-8");
テーブルを修正した後、最終的には、テーブルをバックアップして設定を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ではそれはしません。
私の場合、これはたまたまうまくいきました。
$text = utf8_decode($text)
黒のひし形の文字を疑問符に変えて、次のことができるようにします。
$text = str_replace('?', '', utf8_decode($text));
$text =
セクションに関する警告:これにより、ひし形だけでなく、文字列内のすべての疑問符が変更されます
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>";
}
?>
グローバルな目的のため。
各テキストを変換、コード化、デコードする代わりに、そのままにして、サーバーのphp設定を変更することを好みます。そう、
ダイヤモンドをしましょう
ブラウザから、表示メニューで「テキストエンコーディング」を選択し、テキストを正しく表示できるものを見つけます。
php.iniを編集して、以下を追加します。
default_charset = "ISO-8859-1"
またはISO-8859の代わりにあなたのテキストエンコーディングに合うもの。
phpmyadminに移動してデータベースを選択し、そのテーブルのフィールドの長さ/値を500または1000に増やすだけで、問題が解決します。