2016-10-03 15 views
0
>>> c='中文' 
>>> c 
'\xe4\xb8\xad\xe6\x96\x87' 
>>> len(c) 
6 
>>> cu=u'中文' 
>>> cu 
u'\u4e2d\u6587' 
>>> len(cu) 
2 
>>> s='' 
>>> s 
'\xf0\xa4\xad\xa2' 
>>> len(s) 
4 
>>> su=u'' 
>>> su 
u'\U00024b62' 
>>> len(su) 
2 
>>> import sys 
>>> sys.getdefaultencoding() 
'ascii' 
>>> sys.stdout.encoding 
'UTF-8' 

まず、いくつかの概念を明確にしたいと思います。 私は、cu=u'中文'のようなユニコード文字列は、実際にはPythonシェルのデフォルトでUTF-16でエンコードされていることを学びました。右? '\u*'を見たとき、実際にはUTF-16 encoding'\u4e2d\u6587'はユニコード文字列かバイト文字列ですか?しかしcuので、メモリに格納する必要がありますlen(ユニコード文字列)

0100 1110 0010 1101 0110 0101 1000 0111 

(変換\ u4e2d \ u6587バイナリへの)バイト文字列その場合cuがフォームに保存されていること? 私はそうですか?

ただし、バイト列にすることはできません。さもなければ、len(cu)は2になることはできません、それは4でなければなりません! これはユニコード文字列でなければなりません。 でも!は私が暗黙のうちに スキームは、現在sys.stdout.encodingに設定されているものでUnicode文字列をエンコードするためにもlearned

ことのpythonの試みをしました、この例では、 「UTF-8」です。だから、

>>> cu.encode('utf-8') 
'\xe4\xb8\xad\xe6\x96\x87' 

!どうすればlen(cu) == 2 ???それには'\u'が2つあるからですか?

しかし、それは意味をなしませんlen(su) == 2

何か不足していますか?私のpythonを使用してい

2.7.12

+0

文字! =バイト。 utf16文字は2バイトですが、1文字のみです。 –

+0

あなたはUnicode * first *について読んでみたいです。 http://nedbatchelder.com/text/unipain.html –

+0

@MartijnPietersを参照してくださいありがとう!それはとても役に立ちます – MMMMMCCLXXVII

答えて

0

ザ・パイソンunicodeタイプはUnicodeがをコードポイント、およびエンコーディングとなるものではありませんを保持しています。 Pythonがこれを内部的にどのように実装するかは実装の詳細であり、ほとんどの場合、あなたが気にする必要はありません。 UTF-16はUTF-16コード単位ではありません.UTF-16は、UTF-8のようにUnicodeテキストをエンコードするために使用できるもう1つのコーデックです。

は、ここで最も重要なことは、標準のPython strオブジェクトがまたは特定のコーデックにエンコードされたテキストを保持してもしなくてもよい、バイトを保持していることである(あなたのサンプルでは、​​UTF-8使用していますが、それは与えられていないのです)、そしてunicodeが成り立ちますUnicodeコードポイント。インタラクティブなインタプリタセッションでは、端末のコーデックで、Pythonが受信するバイト数を決定します( unicodeオブジェクトの作成時にsys.stdin.encodingを使用してこれらをデコードします)。 sys.stdoutへの書き込みのみ

は(たとえば、printを使用した場合)Pythonは再び自動的にあなたのUnicode文字列をエンコードします遊びに来てsys.stdout.encoding値を、行います。 の2つのUnicodeコードポイントはUTF-8に再度エンコードされ、それらの解釈方法を知っている端末に書き込まれます。

あなたはおそらく、Pythonとユニコードについてまで読みたい、私はお勧め:

ジョエル・スポルスキで
+0

別の質問があります。あなたが言及したように、 'print'を使うときだけ、pythonは自動的にUnicode文字列を再度エンコードします。だから、bashシェルは、画面に表示するためにそれを受け取ったときにユニコードに再度デコードし、そのユニコードを使って、いわゆるレンダリングやわからないことにマッチさせるか、それをグリフに任せます。ですから、画面上に何かを表示したいのであれば、Unicodeは最後の形式ですか?ああ、あなたは私の意見を聞くことができますか? – MMMMMCCLXXVII

関連する問題