我在OSX10.9上使用python2.7,并且希望将unicode字符串(05. Чайка.mp3)剪成12个符号,所以我使用mp3file[:12]将它切割成12个符号。但结果是,我得到了类似于05. Чайка.m的字符串,它仅为11个符号。但是len(mp3file[:12])返回12,看起来问题在于俄罗斯的符号й。
这里有什么问题吗?
这方面的主要问题是,我通常不能用{:<12}'.format(mp3file[:12])显示字符串.
发布于 2014-04-27 11:53:23
您有具有组合字符的unicode文本:
u'05. \u0427\u0430\u0438\u0306\u043a\u0430.m'U+0306是一个组合BREVE代码点,̆,它与前面的西里尔小写字母I组合形成:
>>> print u'\u0438'
и
>>> print u'\u0438\u0306'
й您可以使用将其规范化为组合形式,U+0439西里尔小写字母短I来代替:
>>> import unicodedata
>>> unicodedata.normalize('NFC', u'\u0438\u0306')
u'\u0439'这使用函数生成一个组合的范式。
发布于 2014-04-27 12:39:47
用户感知字符(字形簇),例如й,可以使用多个Unicode码点来构造,每个Unicode码点依次可以使用几个字节(取决于字符编码)进行编码。
因此,您看到的字符数可能小于编码它们的Unicode或字节字符串的相应大小,如果您分割字节字符串或用户感知的字符(即使是在NFC Unicode规范化形式中),您也可以在Unicode字符中截断它。很明显,这不可取。
要正确地使用计数字符,可以使用与eXtended图形素聚类(一种独立于语言的“视觉字符”)匹配的\X regex
import regex as re # $ pip install regex
characters = re.findall(u'\\X', u'05. \u0427\u0430\u0438\u0306\u043a\u0430.m')
print(characters)
# -> [u'0', u'5', u'.', u' ', u'\u0427', u'\u0430',
# u'\u0438\u0306', u'\u043a', u'\u0430', u'.', u'm']注意,即使没有规范化:u'\u0438\u0306'是一个单独的字符'й'。
>>> import unicodedata
>>> unicodedata.normalize('NFC', u'\u0646\u200D ') # 3 Unicode codepoints
u'\u0646\u200d ' # still 3 codepoints, NFC hasn't combined them
>>> import regex as re
>>> re.findall(u'\\X', u'\u0646\u200D ') # same 3 codepoints
[u'\u0646\u200d', u' '] # 2 grapheme clustershttps://stackoverflow.com/questions/23322952
复制相似问题