pythonは基本Unicodeなので悩むことはないと思ってもWindowsのコンソール出力はunicode対応してない(多分)ので、printなどの出力は日本語環境だとpythonは内部的にcp932に変換しなくてはならないと思われる。
以下のファイルをWindowsのコンソールからpythonで実行すると例外が発生する。
1 2 |
a='你们' print(a) |
1 2 3 4 5 6 7 8 |
C:\work\pyerh>c:\LegacyPrograms\Python34\python.exe nimen.py Traceback (most recent call last): File "nimen.py", line 2, in <module> print(a) UnicodeEncodeError: 'cp932' codec can't encode character '\u4f60' in position 0: illegal multibyte sequence C:\work\pyerh> |
C++や.NETでもUnicodeはコンソールに出力できないようだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include "stdafx.h" #include <stdio.h> #include <windows.h> using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine(L"你们"); _putws(L"你们"); wprintf(L"你们"); DWORD d; WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), L"你们", sizeof(L"你们")-2, &d, NULL); return 0; } |
このファイルはsigつきutf8かUnicode(UTF16)で保存すればclは理解できる。
出力
1 2 |
?? `O・ |
.netのWriteLine()は??に置き換えてるのでpythonでもこのやり方でやってみる。
1 2 3 4 5 |
def myprint(s): sys.stdout.buffer.write(s.encode('cp932', errors='replace')) a='你们' myprint(a) |
このやり方だと美しくないし、パイプ処理のときはおそらくutf8でもOKなのでもっとうまいやり方があるのかもしれない。