7

(Pythonで)4バイトの文字を他の文字に変換する必要があります。これは、次のようなエラーが発生することなく、utf-8mysqlデータベースに挿入するためのものです。

mysqlに4バイトのUnicodeを挿入することによって発生する警告は、次のようにそれを行うことを示しています。

>>> import re
>>> highpoints = re.compile(u'[\U00010000-\U0010ffff]')
>>> example = u'Some example text with a sleepy face: \U0001f62a'
>>> highpoints.sub(u'', example)
u'Some example text with a sleepy face: '

ただし、コメントのユーザーと同じエラーが表示されます。「...文字範囲が正しくありません。」これは、PythonがUCS-2(UCS-4ではない)ビルドであるためと思われます。しかし、私は代わりに何をすべきかはっきりしていませんか?

4

1 に答える 1

15

UCS-2ビルドでは、Pythonは\U0000ffffコードポイント上の各Unicode文字に対して内部的に2つのコードユニットを使用します。正規表現はそれらと連携する必要があるため、これらに一致させるには次の正規表現を使用する必要があります。

highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')

この正規表現は、UTF-16サロゲートペアでエンコードされたすべてのコードポイントに一致します(UTF-16コードポイントU +10000からU+10FFFFを参照) 。

これをPythonUCS-2バージョンとUCS-4バージョン間で互換性を持たせるには、try:/exceptを使用してどちらか一方を使用できます。

try:
    highpoints = re.compile(u'[\U00010000-\U0010ffff]')
except re.error:
    # UCS-2 build
    highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')

UCS-2 pythonビルドのデモンストレーション:

>>> import re
>>> highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
>>> example = u'Some example text with a sleepy face: \U0001f62a'
>>> highpoints.sub(u'', example)
u'Some example text with a sleepy face: '
于 2012-09-28T08:44:18.867 に答える