我有小型应用程序测试应用程序(请在终端中运行它):
#!/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 中选择该字符串,但不幸的是,MatchObject 中的匹配字符偏移量与 GtkTextBuffer 中的字符偏移量不匹配,这是为什么以及如何解决这个问题?
最佳答案
问题是 text
中的字符串是一个 Python 2 字节字符串,恰好包含 UTF-8 编码的数据。此类字符串内的偏移量是字节偏移量,仅对应于数据为全 ASCII 时的字符偏移量。另一方面,get_iter_at_offset
使用的偏移量始终是字符偏移量。
此问题的快速解决方法是将文本转换为 Unicode,例如与:
text = text.decode('utf-8')
然后,re.finditer
也会报告字符偏移量,并且程序会显示预期的输出。
关于python - 为什么字符偏移量会在 gtk.TextBuffer 中移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22327139/