2017-09-01 16 views
2

最近、私はPythonソースコードエンコーディング、特にPEP 263PEP 3120について読んでいます。Pythonでユニコード変数を定義する

# coding:utf-8 

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

このコードはPython2.7でSyntaxErrorでのpython3が、結果のために正常に動作します:

は、私は、次のコードを持っています。
これはおそらくソースコードのエンコーディングとは関係ないかもしれないと私は理解しています。
Python2でUnicode変数名をサポートする方法があるかどうかを知りたいと思います。

PEPが正確にどのような実用的な問題を解決しようとしているのか、提案された解決策をどのように(そしてどこで)活用するのか、難しい時を感じています。私は同じにいくつかの議論を読んだことがあるが、彼らはむしろ私の質問への正しい構文の説明答えを提示しない:

答えて

7

いいえ、Python 2はASCII名のみをサポートしています。 the language reference者:はるかに長いPython 3 version、完全なUnicodeの名前を持っていたことに比べると

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

PEPが解決する実際的な問題は、ソースファイルに127を超えるバイトが出現した場合(つまりユニコード文字列の中にある場合)、Pythonはそれが意味する文字が何であるかを知る方法がない任意のエンコーディング。これはデフォルトでUTF-8として解釈され、このようなヘッダーを追加することで変更できます。

+0

私は申し訳ありませんが、私は「の意味を理解することができません127以上のバイト?あなたは文字のASCIIコードが127を超えていると言っていますか? –

+0

はい。 ASCIIはバイト0〜127の意味を定義します。表示されるほとんどすべてのエンコードは、ASCIIと同じ値をエンコードします。しかし、127を超える値はASCIIではなく、通常は異なるエンコーディングでは完全に異なる文字です。 – RemcoGerlich

+1

これは古典的な記事です:https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character -sets-no-excuses /。 – RemcoGerlich

2

私は、これらの2つの記事は、変数名がベータ記号であるという意味でエンコードについては考えていませんが、変数値のエンコードについては考えていません。

ので、あなたは、この例にコードを変更した場合:

#!/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 

希望あなたの質問

挨拶 フレームに答える

+0

これは解決策ではなく、問題を巡るハックです。ところで、私の問題は、Python2とPython3の相互運用性です。 –

+3

@KshitijSaraogiバージョン間の完全な相互運用性を期待することはできませんが、Python 3では単純にPython 2ではできないことがあります。変数名には特殊文字があります。 –

関連する問題