4 に答える
iconv()
パラメータを使用してUTF-8 文字列を UTF-8 に変換すると//IGNORE
、無効な UTF-8 文字が削除される結果が生成されます。
そのため、iconv 操作の前後で文字列の長さを比較することで、文字化けを検出できます。それらが異なる場合、壊れた文字が含まれていました。
テスト ケース (必ず UTF-8 でファイルを保存してください):
<?php
header("Content-type: text/html; charset=utf-8");
$teststring = "Düsseldorf";
// Deliberately create broken string
// by encoding the original string as ISO-8859-1
$teststring_broken = utf8_decode($teststring);
echo "Broken string: ".$teststring_broken ;
echo "<br>";
$teststring_converted = iconv("UTF-8", "UTF-8//IGNORE", $teststring_broken );
echo $teststring_converted;
echo "<br>";
if (strlen($teststring_converted) != strlen($teststring_broken ))
echo "The string contained an invalid character";
理論的には//IGNORE
、失敗した (空の)iconv
操作をドロップして単純にテストできますが、iconv が無効な文字以外に失敗する理由がある可能性があります...わかりません。私は比較方法を使用します。
これは、UTF-8 でエンコードされていない文字列のエンコードを検出して修正するために行うことです。
$encoding = mb_detect_encoding($str, 'utf-8, iso-8859-1, ascii', true);
if (strcasecmp($encoding, 'UTF-8') !== 0) {
$str = iconv($encoding, 'utf-8', $str);
}
私の知る限り、そのクエスチョン マーク記号は 1 文字ではありません。標準フォント セットには、記号にマップされていないさまざまな文字コードが多数あり、それが使用される既定の記号です。PHP で検出を行うには、まず、使用しているフォントが何であるかを知る必要があります。次に、フォントの実装を見て、どの範囲のコードが「?」にマップされているかを確認する必要があります。記号を指定し、指定された文字がこれらの範囲のいずれかにあるかどうかを確認します。
CUSTOM メソッド ( を使用str_replace
) を使用して、未定義の文字をサニタイズします。
$input='a³';
$text=str_replace("\n\n", "sample000" ,$text);
$text=str_replace("\n", "sample111" ,$text);
$text=filter_var($text,FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW);
$text=str_replace("sample000", "<br/><br/>" ,$text);
$text=str_replace("sample111", "<br/>" ,$text);
echo $text; //outputs ------------> a3