Sublime Text 2上でなんとなくPythonをbuildできるようになったと思っていたのですが、そう甘くなかったのでした。
まずは、Python2.7でやってみます。コードはこれだけ、
# -*- coding: utf-8 -*- print (u'テスト')
で、こんなエラーがでます。
Traceback (most recent call last): File "C:\test\test.py", line 3, in <module> print (u'テスト') UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) [Finished in 0.1s with exit code 1]
前回、コンソールの文字コードをWindows用にcp932にセットしましたが、上のコードはutf-8なので、その関係でエラーになっています。
その当たりのPython側の事情については、こちらのサイト(参考: Pythonを学ぶ(1) HelloWorldでいきなりエラー (Python2とUnicode))に説明があります。
今回はさらにSublime 2側の事情も加わります。
基本的な文字コードが、Sublime Text 2はutf-8ですが、Windowsはcp932です。ということで、Sublime Text 2上でビルドしようとして食い違うと単に文字化けするだけでなく、エラーになります。
ということで、どうすれば良いかですが、いくつか解決策があります。以下に一例をあげます。
Python2の場合、Python.sublime-buildを下記のようにします。文字コードの指定はWindowsブロックに書いています。
{ "cmd": ["python", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python", "windows": { "encoding": "cp932", // Windowsコンソールの文字コード指定 "path": "C:/Python27" // 自分のPythonへのパスを追記 } }
そしてコードにはwrapperを入れます。(参考: Pythonを学ぶ(1) HelloWorldでいきなりエラー (Python2とUnicode))
# -*- coding: utf-8 -*- #Python2向けのencoding wrapper (『Pythonチュートリアル第2版』p204に載っているのだそうです) import codecs, sys sys.stdout = codecs.getwriter('cp932')(sys.stdout) print (u'テスト')
そうすると何事もなかったかのように、
テスト [Finished in 0.1s]
となります。めでたし、めでたし。
では、Python3ではどうしたら良いのでしょう。Python3では、コードの最初でutf-8を宣言したら、あとは特に明示的に指定する必要がなくなっています。しかし、Sublime Text 2のコンソールはcp932です。これは指定してやらないとエラーがでます。Python.sublime-buildにPython3.3へのPathだけを指定した場合、
[Decode error - output not utf-8] [Finished in 0.1s]
こんなエラーがでます。ということで、cp932を指定してやります。
{ "cmd": ["python", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python", "windows": { "encoding": "cp932", // Windowsコンソールの文字コード指定 "path": "C:/Python33" // 自分のPythonへのパスを追記 } }
コードの方は、簡単です。
# -*- coding: utf-8 -*- print ('テスト')
これで、何事もなかったかのように、テストと表示されます。なんか、釈然としませんが、いまのところはこれで良しとします。
ところで今回はじめてPython3を(print文1行だけ)いじったのですが、Python3ではprintは関数になってたんですね。最初、知らなかったのでエラーがでてびっくりしました。
コメント