2012-09-28 7 views
7

4バイト文字を別の文字に変換する必要があります。これは、私のutf-8 mysqlデータベースに次のようなエラーを出さずに挿入することです: "不正な文字列値: '\ xF0 \ x9F \ x94 \ x8E'列 '行1'の行1 'Python、MySQLのエラーを避けるために4バイトのcharを変換する "Incorrect string value:"

Warning raised by inserting 4-byte unicode to mysqlそれをこのように実行します。

>>> 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)ビルド。しかし、私は代わりに何をすべきか明確ではないのですか?

+0

あなたがMySQLで[utf8mb4](http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)文字セットを使用する場合それはまだ問題ですか? –

+0

わかりません。残念ながら、データベースの文字セットを変更することはありません。 – user984003

答えて

15

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

この正規表現は、UTF-16サロゲートペアでエンコードされた任意のコードポイントにマッチする
highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 

UTF-16 Code points U+10000 to U+10FFFFを参照してください

PythonのUCS-2およびUCS-4バージョン間でこの互換性を持たせるために、あなたはどちらか一方を使用するようにtry:/exceptを使用することができますが:UCS-2のpythonのビルドに

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

デモンストレーション:

>>> 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: ' 
+0

素晴らしいです。ありがとう。 – user984003

関連する問題