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は関数になってたんですね。最初、知らなかったのでエラーがでてびっくりしました。