1

Python 2.7 でのエンコーディングについていくつか質問があります。

1.Pythonコードは次のとおりです。

#s = u"严"
s = u'\u4e25'
print 's is:', s
print 'len of s is:', len(s)
s1 = "a" + s
print 's1 is:', s1
print 'len of s1 is:', len(s1)

出力は次のとおりです。

s is: 严
len of s is: 1
s1 is: a严
len of s1 is: 2

なぜ lensが 1 なのか、どうすれ4e25ば 1 バイトに格納できるのか混乱していますか? また、USC-2 の長さが 2 バイトで、USC-4 の長さが 4 バイトであることにも気付きました。なぜ unicode stringsの長さが 1 なのですか?

2. (1) a.pynotepad++ (Windows 7) で名前を付けたファイルを新規作成し、ファイルのエンコーディングを設定しますANSI。コードa.pyは次のとおりです。

# -*- encoding:utf-8 -*-
import sys
print sys.getdefaultencoding()
s = "严"
print "s:", s
print "type of s:", type(s)

出力は次のとおりです。

ascii
s: 严
type of s: <type 'str'>

(2) b.pynotepad++ (Windows 7) で名前を付けたファイルを新規作成し、ファイルのエンコーディングを設定しますUTF-8。コードb.pyは次のとおりです。

# -*- encoding:gbk -*-
import sys
print sys.getdefaultencoding()
s = "严"
print "s:", s
print "type of s:", type(s)

出力は次のとおりです。

  File "D:\pyws\code\\b.py", line 1
SyntaxError: encoding problem: utf-8

(3) 以下のようにファイルを変更b.pyします (ファイルのエンコーディング スタイルは ですUTF-8):

import sys
print sys.getdefaultencoding()
s = "严"
print "s:", s
print "type of s:", type(s)

出力は次のとおりです。

ascii
s: 涓
type of s: <type 'str'>

(4) 以下のようにファイルを変更a.pyします (ファイルのエンコーディング スタイルは ですANSI):

import sys
print sys.getdefaultencoding()
s = "严"
print "s:", s
print "type of s:", type(s)

出力は次のとおりです。

  File "D:\pyws\code\a1.py", line 3
SyntaxError: Non-ASCII character '\xd1' in file D:\pyws\code\a1.py on
line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html f
or details

question2 のこれら 4 つのケースの出力が異なるのはなぜですか? 詳しく解る方いますか?

4

2 に答える 2

5

なぜ s のレンが 1 なのか、どうすれば 4e25 を 1 バイトに格納できるのか混乱しています。また、USC-2 の長さが 2 バイトで、USC-4 の長さが 4 バイトであることにも気付きました。ユニコード文字列の長さが 1 なのはなぜですか?

ユニコード文字列の要点は、これを行うことです。Unicode 文字列の長さは、バイト数ではなく文字数(コード ポイント) です。バイト数はエンコーディングによって異なる場合がありますが、文字数はエンコーディングによって変化しない抽象的な不変量です。

2 番目の質問については、ファイルのエンコーディングを設定する際に、そのファイル内のバイトを文字にマップする方法を Python に伝えているというのが答えです。ファイルの実際のエンコーディングと一致しないエンコーディング (# encoding構文を使用) を指定すると、予期しない動作が発生します。これは、Python がバイトを一方向に解釈しようとしているのに、バイトが実際には別の意味を持つようにファイルが設定されているためです。

得られる動作の種類は、使用するエンコーディングの詳細によって異なります。いくつかの可能性は次のとおりです。

  1. 運が良ければ、競合するエンコーディングを使用しても機能します。これはあなたの最初のケースで起こったことです。
  2. ファイル内のバイトが指定されたエンコーディングと一致しないため、エラーが発生します。これはあなたの2番目のケースで起こったことです。
  3. ファイルの実際のエンコーディングのバイトは、指定されたエンコーディングで解釈されると別の意味になるため、動作するように見えますが、異なる文字が生成されます。これは 3 番目のケースで発生したようですが、その文字は ASCII ではないため、エラーが発生するはずです。(「ファイルのエンコーディング スタイルは UTF-8 です」とは# encoding、ファイルにその旨のディレクティブを設定したということですか?)
  4. エンコーディングを指定しない場合、プレーン ASCII 以外のバイトを使用しようとするとエラーが発生します。これはあなたの最後のケースで起こったことです。

また、str文字列を Unicode として指定しなかったため (たとえば、 でu"...")、文字列の型はすべての場合に になります。ファイルのエンコーディングを指定しても、文字列はユニコードになりません。ファイル内の文字を解釈する方法を Python に伝えるだけです。

しかし、ここにはもっと大きな疑問があります。それは、なぜあなたの例でエンコーディングを使ってそれらのゲームをプレイしているのですか? # encodingファイルが実際にエンコードされているもの以外のエンコードを指定するためにマーカーを使用する理由はまったくなく、そうすることで問題が発生することが保証されています。やらないでください。# encodingファイルのエンコーディングを把握し、マーカーで同じエンコーディングを指定する必要があります。

于 2012-10-19T08:31:48.107 に答える
1
于 2012-10-19T18:02:29.137 に答える