在问这个问题时,我意识到我对原始字符串不了解很多。对于自称是 Django 培训师的人来说,这很糟糕。
我知道编码是什么,我知道什么是u''
本身并因为我得到的是 Unicode 的。
但是r''
到底是做什么的?它会产生什么样的字符串?
最重要的是,这到底是什么ur''
吗?
最后,是否有任何可靠的方法可以从 Unicode 字符串返回到简单的原始字符串?
啊,顺便说一句,如果你的系统和你的文本编辑器的字符集设置为 UTF-8,并u''
实际上做什么?
实际上并没有任何 “原始字符串”。有原始字符串文字,它们恰好是在引号前'r'
“原始字符串文字” 与字符串文字的语法略有不同,其中反斜杠\
表示 “只是反斜杠”(除非在引号之前出现否则将终止该文字)–没有用于表示换行符,制表符,退格键,换页符等的 “转义序列”。在普通的字符串文字中,每个反斜杠必须加倍,以避免被当作转义序列的开始。
之所以存在此语法变体,主要是因为正则表达式模式的语法带有反斜杠(但不会在末尾加重),因此语法繁重(但不要在结尾处使用,因此上面的 “except” 子句无关紧要),并且在避免将它们每个加倍时看起来会更好一些 - - 就这样。表达本机 Windows 文件路径(使用反斜杠代替其他平台上的常规斜杠)也引起了人们的欢迎,但这很少需要(因为普通斜杠在 Windows 上也可以正常工作)并且不完美(由于 “except” 子句)以上)。
r'...'
是字节字符串(在 Python 2. * 中), ur'...'
是 Unicode 字符串(同样在 Python 2. * 中),其他三种引号中的任何一种也可以精确地产生相同类型的字符串(例如r'...'
, r'''...'''
, r"..."
, r"""..."""
都是字节字符串,并且很快)。
不确定您 “返回” 的意思 - 本质上没有前后方向,因为没有原始字符串类型,它只是表达完全正常的字符串对象,字节或 Unicode 的一种替代语法。
是的,在 Python 2 *, u'...'
是当然总是从不同的只是'...'
- 前者是一个 unicode 字符串,后者是一个字节的字符串。文字表达的编码方式可能是完全正交的问题。
例如,考虑一下(Python 2.6):
>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34
Unicode 对象当然会占用更多的存储空间(很短的字符串,很明显;-) 差别很小。
python 中有两种类型的字符串:传统的str
类型和较新的unicode
类型。如果键入字符串文字,而u
,则将得到旧的str
类型,该类型存储 8 位字符,而u
,则将得到较新的unicode
类型,该类型可以存储任何 Unicode 字符。
r
根本不改变类型,它只是改变了字符串文字的解释方式。如果没有r
,则将反斜杠视为转义字符。使用r
,反斜杠被视为文字。无论哪种方式,类型都是相同的。
ur
当然是 Unicode 字符串,其中反斜杠是文字反斜杠,而不是转义码的一部分。
str()
函数将 Unicode 字符串转换为旧字符串,但是如果有任何 Unicode 字符无法在旧字符串中表示,则会出现异常。如果愿意,可以先用问号替换它们,但是这当然会导致这些字符不可读。如果要正确处理 unicode 字符,建议不要使用str
“原始字符串”表示将其存储为原样。例如, '\'
只是一个反斜杠,而不是一个转义符。