我需要将(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)构建。但是后来我不清楚该怎么办?
在UCS-2构建中,python内部在\U0000ffff代码点上为每个unicode字符使用2个代码单元。正则表达式需要与之配合使用,因此您需要使用以下正则表达式来匹配它们:
\U0000ffff
highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
此正则表达式匹配使用UTF-16代理对编码的任何代码点(请参见UTF-16代码点U + 10000至U + 10FFFF)。
为了使它在Python UCS-2和UCS-4版本之间兼容,可以使用try:/ except来使用一个或另一个:
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: '