27220


[![画像の説明をここに入力](https://i.stack.imgur.com/XqAbT.png)](https://i.stack.imgur.com/XqAbT.png)

ターミナル上の対話で バイト文字列で表示されてしまうのです。  
デバッグが面倒で困っています。。  
ターミナルの環境設定では、  
[![画像の説明をここに入力](https://i.stack.imgur.com/CaY9s.png)](https://i.stack.imgur.com/CaY9s.png)  
UTF-8に設定されています。

python2系、  
mac os el capitan  
を利用しています。


CC BY-SA 3.0
2016-06-30T09:49:45.357
27215
2016-06-30T22:11:06.513
2016-06-30T22:11:06.513
8000
17011
question
python unicode
ターミナル上にバイト文字列で表示されてしまう(python2系の文字化け)


Python 3 に移行しましょう。  
もしどうしても Python 3 に移行できない場合は、 `list(xml)` をやめて `print xml` でどうでしょう？

解説:  
一般的に言われる「文字化け」は、テキストの実際のエンコーディングと違うエンコーディングで  
デコードしようとしたときに起こります。（EUC-JPでエンコードされた文字列をcp932でデコードするなど）

しかし、今回のケースでは事情が異なります。  
まず、 Python 2 のバイト文字列を使っているために `list(xml)`
は1文字（厳密には1codepoint）ごとのリストではなく、1バイトごとのリストになっていて、 utf-8
が1文字のために数バイトを利用しているときにその文字がバラバラになってしまっています。  
また、Python 2 が、ASCIIの表示可能文字以外の文字列をクォートしながら表示するときに、 `\x9b` などでエスケープして表示しているのです。  
`print xml` だとうまくいくのは、クォートしたりエスケープしたりせずに直接文字列の内容を出力するようになるからです。

Python 3 の場合はデフォルトでユニコード文字列が使われるので `list(xml)`
で1文字ずつに分解されますし、クォート付きで表示するときもASCIIではなくてUnicodeの表示可能文字はエスケープせずにそのまま表示してくれるので、
`list(xml)` でも文字がそのまま見えると思います。


CC BY-SA 3.0
2016-06-30T10:52:09.980
27220
2016-06-30T10:52:09.980
3019
27215
answer