我有一个小应用程序测试应用程序(请在终端运行):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import time
import gtk
text = '''Python – język programowania wysokiego poziomu ogólnego przeznaczenia[2] i rozbudowanym pakiecie bibliotek standardowych[3], którego ideą przewodnią jest czytelność i klarowność kodu źródłowego. Jego składnia cechuje się przejrzystością i zwięzłością[4][5].
Python wspiera różne paradygmaty programowania: obiektowy, imperatywny oraz w mniejszym stopniu funkcyjny. Posiada w pełni dynamiczny system typów i automatyczne zarządzanie pamięcią, będąc w tym podobnym do języków Perl, Ruby, Scheme czy Tcl. Podobnie jak inne języki dynamiczne jest często używany jako język skryptowy. Interpretery Pythona są dostępne na wiele systemów operacyjnych.'''
main_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
main_window.set_default_size(640, 480)
main_window.connect('destroy', lambda a: gtk.main_quit())
text_buffer = gtk.TextBuffer()
text_buffer.set_text(text)
text_view = gtk.TextView(text_buffer)
text_view.set_wrap_mode(gtk.WRAP_WORD)
main_window.add(text_view)
main_window.show_all()
for m in re.finditer('Python', text):
start_iter = text_buffer.get_iter_at_offset(m.start())
end_iter = text_buffer.get_iter_at_offset(m.end())
t = text_buffer.get_text(start_iter, end_iter)
print('This string should == Python', t)
gtk.main()
这证明了我的问题。在这个应用程序中,我搜索一个带有正则表达式的字符串,接下来我想在GtkTextView中选择该字符串但是匹配的不幸的字符偏移量与GtkTextBuffer中的字符偏移不匹配,为什么会这样,以及如何解决这个问题?
答案 0 :(得分:2)
问题是text
中的字符串是Python 2字节字符串,恰好包含UTF-8编码数据。这种字符串内的偏移是字节偏移,当数据是全ASCII时,它只对应于字符偏移。另一方面,get_iter_at_offset
使用的偏移总是字符偏移。
此问题的快速解决方法是将文本转换为Unicode,例如用:
text = text.decode('utf-8')
然后re.finditer
也会报告字符偏移,程序会显示预期的输出。