[QScintilla] Using python strings with SendScintilla
Baz Walter
bazwal at ftml.net
Sat Nov 8 15:07:09 GMT 2008
i am using the following python method to get undecoded strings from
scintilla:
def range(self, start, end, decode=True):
bytes = '\1' * (end - start)
self.SendScintilla(QSB.SCI_GETTEXTRANGE, start, end, bytes)
if decode:
return bytes.decode('utf8')
return bytes
it works fine, but i noticed some very odd behaviour when i used space
characters to create the string buffer. what would happen is that string
literals used elsewhere in my program would become overwritten by
different characters. so, for instance, my comment method would start
inserting '#b' at the beginning of a line instead of '# '. my guess
about the cause of this is that it has something to do with python's
interning of certain string literals (which includes all the single byte
strings from 0-255). there seems to be a risk that interned python
strings could become 'corrupted' when used to create a buffer that is
passed to SendScintilla.
unfortunately i can't provide example code that demonstrates this
problem, because it is very unpredictable. all i can say with certainty
is that if i use a control character to create the buffer, the problem
goes away. (unless it's '\0', which creates even less predictable
truncation problems).
obviously, i'm hoping that this is a bug that can be fixed as it took me
a *long* time to work out what was causing some very weird problems in
my program. but if not: what would be the safest way to create python
string buffers for use with SendScintilla - is the above method the best
i can do? (i think the use of '\1' for the buffer only works because
it's not being used as a string literal elsewhere in my program).
ps. the reason for bothering with all this is: speed. working with
undecoded strings is much faster for certain operations (like stripping
trailing spaces or replacing tabs).
More information about the QScintilla
mailing list