python - 为什么字符偏移量会在 gtk.TextBuffer 中移动?

标签 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 中选择该字符串,但不幸的是,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/

相关文章:

python - 获取与 selenium (xpath) 的链接并单击 (python 2.7)

python - python2.7如何安装gtk?

c - 是否有 MSYS 脚本文件之类的东西?

haskell - 在 Haskell 和 Glade 中使用切换按钮

python - 从 GtkBuilder 小部件的 PYZ 中的虚拟目录获取文本消息目录

python - Ubuntu 中的 PyGTK 图标模糊

python - 打开 .txt 文件并打印内容的功能不起作用

python - Python 中的 AES-128 CBC 解密

python - 在Python中使用列表的斐波那契数列

python - 安装 PyGtk 时出错