2009-05-26 13 views
7

私は120,000行のUTF-8形式で格納されたMySQLテーブルを持っています。多くのアクセントのあるテキストを含む1つのフィールド、製品名があります。私は、この同じ名前の2番目のフィールドを、URLに優しいフォーム(ASCII)に変換してから入力する必要があります。iconvは、スマートな引用符で "不正な文字"を与える - それらを取り除く方法?

PHPを直接UTF-8に対応していないので、私が使用しています:

 
$value = iconv ('UTF-8', 'ISO-8859-1', $value); 

をISO-8859-1に名前を変換するには、ことによって、任意のアクセント付きの文字を置き換えるために大規模なはstrstrステートメントで(例えば、aはaとなります)。

しかし、元のテキスト名は引用符で入力された、そしてそれは1渡って来るたびのiconvチョーク - 私が取得:

 
Unknown error type: [8] 

iconv() [function.iconv]: Detected an illegal character in input string 

はiconvのを使用する前に、スマート引用符を取り除くために、私が試してみましたテキストファイルには、これらのstr_replaceの原因番目、とても長いので

 
$value = str_replace('’', "'", $value); 

(€™は、UTF-8スマート単一引用符の生の値であるA)

:のような3つの文を使用して毎回タイムアウトするスクリプト。

  1. 前のiconvを実行し、UTF-8文字列からスマート引用符(または無効な文字)を取り除くための最速の方法は何ですか?

  2. または、この問題全体を簡単に解決できますか? UTF-8で多くのアクセントを持つ名前をアクセントのない名前に変換する最速の方法は、ASCIIで正確に綴られていますか?

+2

iconv()の// TRANSLIT能力を試しましたか?アクセント付きの文字を読みやすいASCIIに変換する必要があります。 – ceejayoz

+0

私はドキュメントを見ていますが、iconv()が既にスマートな見積もりでチョークしている場合、// TRANSLITを使用してもまだチョークしませんか? –

+0

これはあなたの "大量のstrstrステートメント"のためのものです - 私は答えの代わりにコメントをしたのです。 – ceejayoz

答えて

2

「リンクフレンドリー」とはどういう意味ですか? <a>...</a>タグの間のテキストは何でもかまいませんので、実際には "URLに優しい"というように、すべてが[a-z-]に変換されたSOのURLに似ています。

これがあれば、文字セット変換ライブラリではなく、翻字ライブラリが必要です。 (私は以前は仕事をするためにiconv()を手に入れていませんでしたが、しばらくは試していません)。translitというベータ版のPHP拡張子probably does the jobがあります。

PHPのインストールに拡張機能を追加できない場合は、同じことをするPHPライブラリを探す必要があります。私はそれを使用していませんが、PHP UTF-8ライブラリはutf8_to_asciiライブラリを実装しています。

あなたが言ったようにiconv()が失敗した場合は、入力が実際に有効なUTF-8ではないことを意味しますので、有効なUTF-8を他のものに置き換える必要はありません。私はそれを取り戻すかもしれません:もしephemient's answerが正しいならば、表示されているiconvエラーは、目的地の文字セットに文字が直接表示されていない可能性がありますのでご注意ください)

+0

質問をURLにやさしいものに変更しました。 PHPに拡張機能を追加することはできません。あなたが提案した翻訳ライブラリをチェックアウトしましたが、それは私のオリジナルのソリューションより約35%遅かったです。 –

0

MySQLのREPLACE文字列関数は問題の文字列をアポストロフィなどに変更しますか?あなたは "交換すべき文字列"部分をまとめることができるかもしれません。 CONCATCHARと呼びます...

+0

問題の文字列を置き換えるためにstr_replaceを使い始めましたが、スクリプトをあまりにも遅くしました($ value = str_replace( '’'、 "'" $ value);’はスマートシングルクォートを嫌う)。 CHAR呼び出しでCONCATが意味することを明確にすることはできますか? –

+0

SQLでREPLACEを行い、CONCAT(CHAR(...)、...)を使用して、置換しようとしている部分文字列をバイト単位で構成することをお勧めしました。 –

6

Glibc(およびGNU libiconvsupports//TRANSLIT//IGNOREサフィックス。

 
$ echo $'\xe2\x80\x99' 
’ 
$ echo $'\xe2\x80\x99' | iconv -futf8 -tiso8859-1 
iconv: illegal input sequence at position 0 
$ echo $'\xe2\x80\x99' | iconv -futf8 -tiso8859-1//translit 
' 

私はiconvは、PHPで使用されているかわからないんだけど、ドキュメントが//TRANSLIT//IGNOREがあまりにもそこに動作することを意味します

したがって、Linux上で、これはうまく動作します。

関連する問題