1

これについて何か助けていただければ幸いです。私はこの問題に何日も費やしましたが、オンラインで見つけた提案のどれも私に解決策を与えてくれないようです.

サプライヤからの CSV ファイルがあります。Microsoft システムからエクスポートされたようです。

PHP を使用してデータを MySQL (両方とも最新バージョン) にインポートしています。

取り除けない奇妙なキャラクターを含む特定のレコードが 1 つあります。文字を手動で編集して削除することは可能ですが、これは 1 日に複数回行われるため、自動化されたソリューションを希望します。

この文字は、「スマート クォート」の解釈のようです。16 進エディタは、文字コードが C2 と 92 であることを教えてくれます。16 進エディタでは、奇妙な A の後にスマート クォートが続くように見えます。他のエディタや Calc、Writer などでは、ボックスとして表示されます。"</p>

エンコーディングを決定するために mb_detect_encoding を使用しています。CSV ファイル内のすべてのレコードは、UTF-8 として返される奇妙な文字を含むものを除いて、ASCII として返されます。問題のあるレコードを MySQL に挿入すると、Workbench に正方形として表示されます。

MySQL テーブルは に設定されてutf-8 – utf8_unicode_ciおり、その他の異常な UTF 文字 (分数など) は問題ありません。

私はこれに対して多くの解決策を試しました...

などなどですが、どれも私のために働いていません。

私が実際にやりたいのは、問題のある文字を削除または置換することです。理想的には、16 進値の検索と置換を行いますが、試した例はどれも機能しませんでした。

誰でも私がこれを進めるのを手伝ってくれますか?

編集:
評判が不十分な
ため、回答を投稿できません:ご意見ありがとうございます。とても有難い。
16進検索と置換を使用します。

$DodgyText = preg_replace("/\xEF\xBE\x92/", "" ,$DodgyText);

それがエレガントな解決策ではないことはわかっていますが、簡単な修正が必要であり、これでうまくいきます。

4

3 に答える 3

3

別の解決策は次のとおりです。

$contents = iconv('UTF-8', 'Windows-1251//IGNORE',$contents);
$contents = iconv('Windows-1251', 'UTF-8//IGNORE',$contents);

Windows-1251 をローカルのエンコーディングに置き換えることができる場所。

于 2013-03-14T10:33:33.013 に答える
1

一見すると、これは UTF-8 ファイルのように見えます。(UTF-8 は ASCII テーブルの最初の 128 文字と同一であるため、特殊文字を除いてすべてが ASCII として検出されます。)

データベース接続も UTF-8 でエンコードされている場合は機能するはずです (デフォルトではそうではない可能性があります)。

その方法はデータベース ライブラリによって異なります。接続エンコーディングの設定にサポートが必要な場合は、使用しているライブラリをお知らせください。

于 2012-07-02T13:39:09.890 に答える
0

確立された調査結果に基づいて更新されたコード

16進表記を使用して、文字列の検索と置換を行うことができます。

str_replace("\xEF\xBE\x92", '', $value);

これにより、特別なコードが削除された値が返されます

とはいえ、データベーステーブルがUTF-8の場合、その変換は必要ありません。代わりに、接続(またはセッション)文字セット(つまりSET NAMES utf8;)を確認できます。これの構成は、データベースへの接続に使用するライブラリによって異なります。

使用できる値をデバッグするにはbin2hex(); これは通常、オンラインで検索を行うのに役立ちます。

于 2012-07-02T13:42:16.333 に答える