在 Python 中定义 unicode 变量

Posted

技术标签:

【中文标题】在 Python 中定义 unicode 变量【英文标题】:Defining unicode variables in Python 【发布时间】:2018-02-10 14:08:57 【问题描述】:

最近,我一直在阅读有关 Python 源代码编码的信息,尤其是 PEP 263 和 PEP 3120。

我有以下代码:

# coding:utf-8

s = 'abc∂´ƒ©'
ƒ = 'My name is'
ß = '˚ß˙ˆ†ˆ∆ ßå®åø©ˆ'
print('s =', s)
print('ƒ =', ƒ, 'ß =', ß)

此代码适用于 Python3,但在 Python2.7 中会生成 SyntaxError。 我明白这可能与源代码编码无关。 所以,我想知道是否有办法在 Python2 中支持 Unicode 变量名。

总之,我也很难弄清楚 PEP 究竟要解决什么实际问题,以及我如何(以及在​​哪里)利用所提出的解决方案。我已经阅读了一些关于相同的讨论,但它们并没有给出我的问题的答案,而是对正确语法的解释:

Correct way to define Python source code encoding Working with utf-8 encoding in Python source Where does this come from: -*- coding: utf-8 -*- Is '# -*- coding: utf-8 -*-' also a comment in Python?

【问题讨论】:

【参考方案1】:

不,Python 2 仅支持 ASCII 名称。来自the language reference:

identifier ::=  (letter|”_”) (letter | digit | “_”)*
letter     ::=  lowercase | uppercase
lowercase  ::=  “a”…”z”
uppercase  ::=  “A”…”Z”
digit      ::=  “0”…”9”

与更长的Python 3 version 相比,它确实具有完整的 Unicode 名称。

PEP 解决的实际问题是,以前,如果超过 127 的字节出现在源文件中(比如在 unicode 字符串中),那么 Python 无法知道该字符是指哪个字符,因为它可能是任何字符。编码。现在默认解释为UTF-8,可以通过添加这样的header来改变。

【讨论】:

对不起,我无法理解“超过 127 的字节”的含义?你的意思是说一个字符的ASCII码超过127? 是的。 ASCII 定义了字节 0 到 127 的含义。您将看到的几乎所有编码都将这些值编码为与 ASCII 相同。但是超过 127 的值不是 ASCII,通常是不同编码的完全不同的字符。 这是经典文章:joelonsoftware.com/2003/10/08/….【参考方案2】:

我不认为这两篇文章是关于编码的,例如你的变量名称是一个 Beta 符号,而是关于变量值的编码。

因此,如果您将代码更改为此示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

a = 'abc?´ƒ©'
b = 'My name is'
c = '°ß?ˆ†ˆ? ßå®åø©ˆ'
print 'a =', a # by the way, the brackets are only used in python 3, so they are also being displayed when running the code in python 2.7
print 'b =', b, 'c =', c 

希望能回答你的问题

问候 框架

【讨论】:

这将是解决问题而不是解决方案。顺便说一句,我的问题是 Python2 和 Python3 之间的互操作性。 @KshitijSaraogi 你不能指望版本之间有完美的互操作性,有些事情你可以在 Python 3 中做而在 Python 2 中根本做不到。变量名的特殊字符就是其中之一东西。

以上是关于在 Python 中定义 unicode 变量的主要内容,如果未能解决你的问题,请参考以下文章

Python—编码与解码(encode()和decode())

有没有一种简单的方法可以让 unicode 在 python 中工作?

Unicode与编码方式

NameError:未定义全局名称“unicode” - 在 Python 3 中

java中如何输出字符变量的Unicode编码值

C ++ 0x中char和Unicode的签名