そろそろ Python を 3 に移行しようと思う。
はて、日本語はどうなるのだろう?
Linux ではまったく使っていなかったから解らない。
多分組み込みの open() 関数はツジツマを合わせていると思う。
GIO での読み書きはどうなるやら、実験。
# Write and Length Check
s = '日本語'
f = open('test.txt', 'w')
f.write('{0}\n{1}'.format(len(s), s))
f.close()
# g_file_load_contents
from gi.repository import Gio
gfile = Gio.File.new_for_path('test.txt')
res = gfile.load_contents(None)
print(res)
# Streaming I/O
fstream = gfile.read(None)
dstream = Gio.DataInputStream.new(fstream)
print(dstream.read_line_utf8(None))
print(dstream.read_line_utf8(None))
fstream.close(None)
うん、文字列はシッカリ gunichar(UCS-4) だね。
やはり組み込み関数は仕事キッチリか。
g_file_load_contents だと、、、バイナリ扱いになってしまった。
読み込んでも UTF-8 のままで保持するということみたい。
文字列の読み書きに利用するなということなのだろう。
Streaming I/O では文字列自体は UCS-4 化するみたいだけど文字列長は UTF-8 バイナリでカウントしている。
試しに dstream.read_Line(None) に書き換えたら予想通り文字列がバイナリに。
GFileOutputStream は UCS-4 の文字列を普通に UTF-8 として書き込みできた。
うーん、やはり文字列が UCS-4 だと扱い辛いぞ。
GTK+ の GtkEntry の文字列はどうなるんだろう?
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
from gi.repository import Gtk
class Win(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_title('たいとるばぁ')
self.connect('delete-event', Gtk.main_quit)
self.entry = Gtk.Entry()
button = Gtk.Button('保存')
button.connect('clicked', self.on_clicked)
vbox = Gtk.VBox()
vbox.pack_start(self.entry, False, False, 0)
vbox.pack_start(button, False, False, 0)
self.add(vbox)
self.show_all()
def on_clicked(self, widget, data=None):
f = open('gtk.txt', 'w')
f.write(self.entry.get_text())
f.close()
if __name__ == '__main__':
w = Win()
Gtk.main()
タイトルバー等の文字列も GtkEntry とのやりとりも UCS-4 の内部文字列のままでイケてしまうようである。
GIO で文字列を扱う場合以外は Python2 時と同様に使えると思ってよさそう。
なんて思っていたら落とし穴がありそうだが…
もう少し検証したいけど Boxes 上の Ubuntu では辛い。
「クリップボードを共有」を ON にしているのに何故かホストと共有できなくて面倒くさいぞコノヤロウ。
Fedora に入れたいけどデフォルトで使えるコードというポリシーに反するし。
18 にはデフォルトで入るみたいだが β すらまだ出ていない。
ちなみに本サイトのメール送信フォームを利用して文字列のやりとりというバカなことをやっていたりする、サイトを作っておくと便利だよ。

