为什么Python将此UTF-8字符识别为两个字符而不是一个字符

use*_*351 2 python unicode utf-8

我正在尝试处理的一些UTF-8文本有这个可爱的4字节字符:\ xF0\x9F\x98\xA5

根据这个网站,它是"失望但放心的脸":http://apps.timwhitlock.info/emoji/tables/unicode

在我看来,Python将其视为两个独立的角色.

这是我的测试代码:

mystring = '\xF0\x9F\x98\xA5'.decode('utf-8')

print len(mystring)

print mystring

print len(mystring.encode('utf-8'))

for c in mystring:
    print c
Run Code Online (Sandbox Code Playgroud)

当我打印mystring时,我得到一张可爱的脸.但是当我打印出mystring的长度时,我得到2.

顺便说一句,我试图解决这个问题的原因是我需要在字符串中处理4个字节的字符,这样我就可以推送到5.5之前的MySQL数据库(它只能处理3个字节的UTF-8).

我很感激为什么Python似乎将其识别为两个字符,以及如何检测UTF-8字符串中的4字节字符.

谢谢.

roe*_*and 5

您正在使用的Python版本尚未正确计算U + FFFF以上的字符数.其他一些语言(JAVA,JavaScript)表现得那样(你可以认为是一个bug),较新版本的Python会正确地将其视为一个字符.

识别4字节字符很容易,4的第一个字节始终是形式11110xxx(因此所有值都在range(0xf0, 0xf8)).它们代表U + FFFF之上的所有代码点.