11

SQL*Loader を使用してデータをロードする際に、Perl スクリプトを使用して不正な UTF-8 文字を検出し、空白に置き換えたいと考えています。これどうやってするの?

4

3 に答える 3

4

Python を考えてみましょう。ユーザー定義のエラー ハンドラを使用してコーデックを拡張できるため、デコードできないバイトを必要なものに置き換えることができます。

import codecs
codecs.register_error('spacer', lambda ex: (u' ', ex.start + 1))
s = 'spam\xb0\xc0eggs\xd0bacon'.decode('utf8', 'spacer')
print s.encode('utf8')

これは以下を出力します:

spam  eggs bacon
于 2008-10-15T17:47:40.837 に答える
1

RFC 3629では、UTF-8 文字の構造について説明しています。それを見てみると、無効な文字を見つけるのは非常に簡単であり、次の文字境界は常に簡単に見つけることができることがわかります (128 未満の文字、または「長い文字」の開始マーカーの 1 つです)。 110、1110、または 11110 の先頭ビット)。

しかし、BKB はおそらく正しいでしょう。最も簡単な答えは perl に任せることですが、そのフィルターが有効な状態で間違った utf-8 を検出したときに Perl が何をするかはわかりません。

于 2008-10-15T11:44:35.377 に答える
1

編集: (SQL ローダーに関するビットは、もはや関連性がないように思われるため削除されました。)

1 つの問題は、不正な UTF-8 文字の「終わり」と見なされるものを解決することです。何が違法かを言うのは簡単ですが、次の合法的な文字がどこから始まるかは明らかではないかもしれません.

于 2008-10-15T10:07:32.140 に答える