为什么字符偏移在gtk.TextBuffer中移位?

时间:2014-03-11 13:28:15

标签: python gtk pygtk

我有一个小应用程序测试应用程序(请在终端运行):

#!/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中的字符偏移不匹配,为什么会这样,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

问题是text中的字符串是Python 2字节字符串,恰好包含UTF-8编码数据。这种字符串内的偏移是字节偏移,当数据是全ASCII时,它只对应于字符偏移。另一方面,get_iter_at_offset使用的偏移总是字符偏移。

此问题的快速解决方法是将文本转换为Unicode,例如用:

text = text.decode('utf-8')

然后re.finditer也会报告字符偏移,程序会显示预期的输出。