问this question的时候,我意识到我对原始弦知之甚少.对于自称是Django教练的人来说,这太糟糕了.
我知道什么是编码,我知道单是u''
就可以做什么,因为我得到了Unicode.
但是
r''
到底是做什么的呢?它会产生什么样的字符串呢?最重要的是,
ur''
到底做了什么?最后,有没有可靠的方法可以从Unicode字符串返回到简单的原始字符串?
顺便问一下,如果你的系统和文本编辑器字符集设置为UTF-8,
u''
真的能做什么吗?
问this question的时候,我意识到我对原始弦知之甚少.对于自称是Django教练的人来说,这太糟糕了.
我知道什么是编码,我知道单是u''
就可以做什么,因为我得到了Unicode.
但是r''
到底是做什么的呢?它会产生什么样的字符串呢?
最重要的是,ur''
到底做了什么?
最后,有没有可靠的方法可以从Unicode字符串返回到简单的原始字符串?
顺便问一下,如果你的系统和文本编辑器字符集设置为UTF-8,u''
真的能做什么吗?
没有什么"原始string";还有raw string literals,它正是在开始引号前用'r'
标记的字符串文本.
"原始字符串文字"是字符串文字的一种稍有不同的语法,其中反斜杠\
表示"只是一个反斜杠"(除非它正好出现在引号之前,否则会终止文字)——没有"转义序列"来表示换行符、制表符、退格符、换行符等.在正常的字符串文字中,每个反斜杠必须加倍,以避免被视为转义序列的开始.
这种语法变体之所以存在,主要是因为正则表达式模式的语法中充斥着反斜杠(但不是在末尾,所以上面的"Except"子句无关紧要),而且当您避免将每一个都重复使用时,它看起来会更好一些--仅此而已.它还流行于表示原生Windows文件路径(使用反斜杠,而不是其他平台上的常规斜杠),但很少需要(因为普通斜杠在Windows上也很好用),而且不完美(由于上面的"例外"子句).
r'...'
是字节字符串(在Python2.*中),ur'...'
是Unicode字符串(同样,在Python2.*中),另外三种引号中的任何一种也生成完全相同类型的字符串(例如,r'...'
、r'''...'''
、r"..."
、r"""..."""
都是字节字符串,依此类推).
不确定您所说的"前进back"是什么意思--本质上没有后退和前进方向,因为没有原始字符串type,它只是一种替代语法,用于表达完全正常的字符串对象,字节或Unicode,尽管它们可能是字节或Unicode.
是的,在Python 2中,u'...'
is当然总是与'...'
不同——前者是unicode字符串,后者是字节字符串.文字的编码方式可能是一个完全正交的问题.
例如,考虑(Python 2.6):
>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34
Unicode对象当然会占用更多的内存空间(显然,对于非常短的字符串来说,差别很小;-).