2009-09-16 23 views
8

に置き換えてください。空白文字のutf-8文字列で無効な文字を置き換える(PHP5ではregexを使用します)?PHP:utf-8文字列の無効な文字を

$text = iconv("UTF-8", "UTF-8//IGNORE", $text); 

のiconv

+1

何をしますか?空白を取り除く?またはutf-8文字? 例を挙げてください。 –

+3

UTF-8文字を取り除くのは簡単です: '$ text = '';' :-) – Joey

答えて

22

使用はmanualを参照してください。

乾杯

+7

これは私のためには機能しませんでした。無効な文字が残りました。ちょうどそれがbobefのために働かなかったように。それはちょうど仕事をしません。 – Rodniko

+0

これは私のために働いた。ソースファイルがSBAフランチャイズコードのCSVをダウンロードされました。これをLaravelシーダーで使用するためにJSONに手動でフォーマットしました。しかし、私のフォーマットされたファイルがJSONの検証をパスしたとしても、PHPが解読できなかったファイルには、隠された無効なUTF-8文字がまだ残っていました。 – Ixalmida

+0

私はまだ詳細をデバッグしていませんが、iconvとmb_convertはjson_encode()の問題を解決しません。 多くの場合に役立つかもしれません。 – John

5

することができますをmbstringのでdo:

$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8'); 

無効な文字を空白で置き換えます。無効な文字を?のようなものに置き換えたい場合にはうまくいかないようです。

を参照してください:あなたは、このに興味がある可能性があり、PHPのXMLやJSONパーサーを使用しているときに呪われた「無効な文字」エラーに遭遇した場合はReplacing invalid UTF-8 characters by question marks, mbstring.substitute_character seems ignored

1

残念ながら、PHPのXMLパーサーとJSONパーサーは、UTF8以外の文字を無視するのではなく、むしろ役立たないエラーを停止してスローします。私は以下のコードフォームを見つけて、私のために優れた仕事をしてくれました。

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? 
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'. 
'|[\x00-\x7F][\x80-\xBF]+'. 
'|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. 
'|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. 
'|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', 
'?', $some_string); 

//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ? 
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. 
'|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string); 
+0

はjson_encodeの問題を解決しません。 有効なUTF8も無効であると報告しています。悲しいことに、問題の原因を突き止めません。 – John

関連する問題