一尘不染

Python,将4字节字符转换为避免MySQL错误“错误的字符串值:”

mysql

我需要将(4个字节)的char转换为其他字符(在Python中)。这是将其插入到我的utf-8
mysql数据库中,而不会出现诸如以下的错误:“不正确的字符串值:行1的’行’的’\ xF0 \ x9F \ x94 \ x8E’

通过向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)构建。但是后来我不清楚该怎么办?


阅读 242

收藏
2020-05-17

共1个答案

一尘不染

在UCS-2构建中,python内部在\U0000ffff代码点上为每个unicode字符使用2个代码单元。正则表达式需要与之配合使用,因此您需要使用以下正则表达式来匹配它们:

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

此正则表达式匹配使用UTF-16代理对编码的任何代码点(请参见UTF-16代码点U + 10000至U +
10FFFF)

为了使它在Python UCS-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: '
2020-05-17