2014-01-21 18 views
6

こんにちは、私はどのように追加することができますし、Pythonで拡張ASCIIコードを印刷することを知りたい。 私は以下を持っています。python:拡張ASCIIコード

code = chr(247) 

li = [] 
li.append(code) 
print li 

結果は、分割シンボルでなければならないので、結果は['\ xf7']です。私がシンプルなコードを直接 "print code"で印刷すると、分割シンボルが表示されますが、それをリストに追加しても表示されません。私は間違って何をしていますか?

ありがとうございました。

+1

拡張ASCIIは明確に定義されていません。沢山あります。なぜUnicodeを使用しないのですか? –

+3

"拡張ASCII"のようなものはありません.247が異なることを意味することができる多くの異なるエンコーディングがあります。適切なエンコーディングで文字列をデコードする必要があります。 – RemcoGerlich

+0

拡張Asciiは、ASCII文字128〜255です。ASCII文字の後半になります。 –

答えて

9

リストを印刷すると、リストのすべての要素のデフォルト表現が出力されます。つまり、リストのそれぞれにrepr()を呼び出します。文字列のrepr()は、エスケープされたコードです。リストのすべての要素を適切に出力したい場合は、例えば', '.join(li)で文字列に変換する必要があります。

コメントに記載されているように、実際には「拡張ASCII」というようなものはありません。さまざまなエンコーディングがあります。

+4

-1は「ASCIIを拡張する」と考えています。 – jsbueno

+12

+1を補償するために+1: –

+0

@jsbueno彼は明言しています。「拡張ASCII」は実際には存在しません。 – glglgl

6

「ASCIIコードを拡張する」というようなことはありませんが、ユニコード標準で定義されているように、数万文字もあります。

テキスト端末の文字コードのエンコーディングに制限することができます。これは "ASCIIを拡張"と考えるかもしれませんが、例えば "latin-1"かもしれません(例えば、 LinuxやMac OS Xの、あなたのテキスト端末はおそらくUTF-8エンコーディングを使用して、ユニコードで利用可能な何千もの文字の数十のいずれかを表示することができます)

だから、あなた必見をするためにこの作品を読んでどんなテキストが、1992年以降に - "拡張ASCII"と信じているプロダクションアプリケーションを実行しようとすると、あなた自身とあなたのユーザーとエコシステム全体を一度に傷つけようとします:http://www.joelonsoftware.com/articles/Unicode.htmlPython2 printは、渡されたオブジェクトに対して暗黙のstr変換を呼び出します。リストを使用すると、この変換ではリストの要素ごとにstrが再帰的に呼び出されるのではなく、要素のrepr、非ASCII文字を数値表現またはその他の不適切な表記として表示します。

は、あなたは、単にたとえば、Unicode文字列で、ご希望の文字を結合して、ターミナルのエンコーディングを使用して、通常はそれらを印刷することができます:あなたは間違って何もしないされている

import sys 

mytext = u"" 
mytext += unichr(247) #check the codes for unicode chars here: http://en.wikipedia.org/wiki/List_of_Unicode_characters 

print mytext.encode(sys.stdout.encoding, errors="replace") 
+0

説明と記事参照のおかげで - それは良い読書になります。 – user1831677

+0

最初にAsciiの文字が0-127だった、Extended Ascii、128-256があった。その後、文字セット内の256文字を超えるUnicodeがありました。 Extended Asciiがないと言うのは間違いです。 –

+0

あなたは私の一日を救った。私はあきらめようとしていた...:] – PMateus

0

何をするかは、リストに長さ1の文字列を追加することです。

この文字列には、印刷可能な文字の範囲外で、ASCII以外の文字(7ビットのみ)が含まれています。その表現は'\xf7'のように見えます。

これを印刷すると、システムのように変換されます。

Python 2では、バイトが印刷されます。結果の出力は、システムのエンコーディングに応じて、ディビジョン・シンボルまたはその他のものになります。

Python 3では、Unicode文字で、stdoutがどのように設定されているかに従って処理されます。通常、これは本当に分割シンボルでなければなりません。

リストの表示では、文字列の__repr__()が呼び出され、表示されます。

+0

明快で簡単な説明をありがとう。 – user1831677

2

おそらくcharmapエンコーディングが必要です。これにより、ユニコードを '魔法'の変換なしでバイトに変換できます。

s='\xf7' 
b=s.encode('charmap') 
with open('/dev/stdout','wb') as f: 
    f.write(b) 
    f.flush() 

私のシステムには÷が印刷されます。

「拡張ASCII」は、ASCIIの独自の拡張機能のうち、公式に採用されておらず、お互いに互換性がないものを指します。その結果、そのコードによって出力されるシンボルは、制御端末の解釈方法に応じて変化します。