2

私は「 Göran 」という名前を持っていますが、それを「 Goran 」に変換したいのですが、これは特定の単語のアクセントを外す必要があることを意味します。しかし、私が試したことは、すべての単語のアクセントを外していないようです。

これは私が Unaccent に使用したコードです:

private function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8'));
}

機能していない場所 (不適切なマッチング) : 右側で期待される結果が得られていないことを意味します。

JÃŒrgen => Juergen
InÚs => Ines

動作している場所(正しい一致):

Göran => Goran
Jørgen Ole => Jorgen
Jérôme => Jerome

その理由は何ですか?直し方?すべてのケースを処理するためのより良いアプローチはありますか?

4

2 に答える 2

4

これはあなたが探しているものかもしれません

特殊文字を通常の文字に変換する方法は?

ただし、代わりに「utf-8」を使用してください。

$text = iconv('utf-8', 'ascii//TRANSLIT', $text);

http://us2.php.net/manual/en/function.iconv.php

于 2012-10-11T06:21:09.147 に答える
2

簡潔な答え

2 つの問題があります。

まず。これらの名前にはアクセントがありません。それらは正しくフォーマットされていません。

UTF-8 ファイルを持っていたようですが、ISO-8559-1 を使用して作業していたようです。たとえば、エディターに ISO-8859-1 を使用するように指示し、UTF-8 を使用してブラウザーのテキスト領域にテキストをコピー アンド ペーストするとします。次に、不適切な形式の名前をデータベースに保存しました。私は、コピー&ペーストから生じるこのような問題を数多く見てきました。

名前が正しくフォーマットされていれば、2 番目の問題を解決できます。アクセントを外します。これを扱う質問がすでにあります:特殊文字を通常の文字に変換する方法は?

長い回答(不適切な形式のアクセント付き文字のみに焦点を当てています)

Göran好きなときに手に入るのはなぜGöranですか?

Unicode から始めましょう: 文字öは UnicodeLATIN SMALL LETTER O WITH DIAERESISです。その Unicode コード ポイントは、16 進数の F6 または 10 進数の 246 です。Unicode データベースへのこのリンクを参照してください。

ISO-8859-1 では、0 から 255 までのコード ポイントはそのまま残されます。分音記号付きの小文字 o は、1 バイト (246) として保存されます。

UTF-8 と ISO-8859-1 は、コード ポイント 0 から 127 (別名 ASCII) を同じように扱います。それらはそのまま残され、1 バイトのみとして保存されます。これらはコード ポイント 128 ~ 255 の処理が異なります。UTF-8 は Unicode コード ポイント セット全体をエンコードできますが、ISO-8859-1 は最初の 256 コード ポイントのみを処理できます。

では、UTF-8 は 128 を超えるコード ポイントに対して何を行うのでしょうか? コードポイントが大きくなるにつれて、コードポイントのエンコーディングの可能性は千鳥状になります。コード ポイントが 2047 までの場合は、2 バイトで十分です。それらは次のようにエンコードされます: (このビットスキーマを参照してください)

x xxxx xxxx xxxx => 110xxxxx 10xxxxxx

大文字の o をダイアレス付きで UTF-8 にエンコードしてみましょう。ビットは:0 0000 1111 0110で、 にエンコードされ11000011 10110110ます。これはいいね。

ただし、これらの 2 バイトは、2 つの有効な(!) ISO-8559-1 バイトと誤解される可能性があります。11000011(C3 hex) と10110110(B6 hex)とは何ですか? ISO-8859-1 テーブルを調べてみましょう。C3 は大文字のチルダ、B6 は段落記号です。どちらの符号も有効であり、ビットを見るだけでこの誤解を検出できるソフトウェアはありません。

名前がどのように見えるかを知っている人が絶対に必要です。Göran名前だけではありません。名前の途中に大文字があり、段落記号はまったく文字ではありません。残念ながら、この誤解はここで終わりではありません。すべての文字が有効であるため、コピーして貼り付けて再レンダリングできます。この過程で、誤解が再び繰り返される可能性があります。でやってみましょうGöran。私たちはすでにそれを一度誤解しており、フォーマットが不適切Göranでした。大文字の A、チルダ、および段落記号は、それぞれUTF-8 で 2 バイト(!) にレンダリングされ、4 バイトの gobbledygook として解釈されますGÃÅ.ran

可哀想なユルゲン!ウムラウトüは 2 回虐待され、JÃŒrgen.

ここのウムラウトにはひどい混乱があります。OP がこのデータをそのまま顧客から入手した可能性さえあります。これは一度私に起こりました: 混合データを取得しました: 同じファイル内で、適切にフォーマットされたデータと不適切なフォーマットが 1 回、2 回、3 回ありました。とてもイライラします。

于 2012-10-11T06:22:20.273 に答える