首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么python字符串剪切在请求12时返回11个符号?

问为什么python字符串剪切在请求12时返回11个符号?
EN

Stack Overflow用户
提问于 2014-04-27 11:43:10
回答 2查看 214关注 0票数 2

我在OSX10.9上使用python2.7,并且希望将unicode字符串(05. Чайка.mp3)剪成12个符号,所以我使用mp3file[:12]将它切割成12个符号。但结果是,我得到了类似于05. Чайка.m的字符串,它仅为11个符号。但是len(mp3file[:12])返回12,看起来问题在于俄罗斯的符号й。

这里有什么问题吗?

这方面的主要问题是,我通常不能用{:<12}'.format(mp3file[:12])显示字符串.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-27 11:53:23

您有具有组合字符的unicode文本:

代码语言:javascript
复制
u'05. \u0427\u0430\u0438\u0306\u043a\u0430.m'

U+0306是一个组合BREVE代码点,̆,它与前面的西里尔小写字母I组合形成:

代码语言:javascript
复制
>>> print u'\u0438'
и
>>> print u'\u0438\u0306'
й

您可以使用将其规范化为组合形式,U+0439西里尔小写字母短I来代替:

代码语言:javascript
复制
>>> import unicodedata
>>> unicodedata.normalize('NFC', u'\u0438\u0306')
u'\u0439'

这使用函数生成一个组合的范式。

票数 5
EN

Stack Overflow用户

发布于 2014-04-27 12:39:47

用户感知字符(字形簇),例如й,可以使用多个Unicode码点来构造,每个Unicode码点依次可以使用几个字节(取决于字符编码)进行编码。

因此,您看到的字符数可能小于编码它们的Unicode或字节字符串的相应大小,如果您分割字节字符串或用户感知的字符(即使是在NFC Unicode规范化形式中),您也可以在Unicode字符中截断它。很明显,这不可取。

要正确地使用计数字符,可以使用与eXtended图形素聚类(一种独立于语言的“视觉字符”)匹配的\X regex

代码语言:javascript
复制
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'是一个单独的字符'й'。

代码语言:javascript
复制
>>> 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 clusters

也见,在Python中,我如何最有效地将UTF-8字符串块用于REST传递?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23322952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档