簡潔な答え
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 回ありました。とてもイライラします。