<div dir="ltr"><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail-msg-7657086096225050773">





<div style="overflow-wrap: break-word;" lang="EN-US">
<div class="gmail-m_-7657086096225050773WordSection1">
<p class="MsoNormal">What is your code snippet for the use of QTextCodec?</p></div></div></div></blockquote><div>Here it is complete with my notes from several years ago. This is for "nonce" files in an app that runs on multiple platforms, hence the concern with ForLocale. Looking at it, I suspect I should go back to the QTextStream docs and start over.</div><div><br></div><div># -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=<br># Class MemoryStream provides a QTextStream based on an in-memory buffer<br># which will not go out of scope causing a crash. It also provides the<br># convenient methods rewind() and writeLine(). QTextStream.pos() is<br># overridden to do a flush() before returning the position, otherwise<br># it is never accurate. Note that pos() returns a count of bytes, while<br># the units being written are 16-bit Unicode chars. Hence the sequence<br># mst = MemoryStream(); mst.writeLine('FOO'); mst.pos() --> 8<br><br>class MemoryStream(QTextStream):<br>    def __init__(self):<br>        # Create a byte array that stays in scope as long as we do<br>        self.buffer = QByteArray()<br>        # Initialize the "real" QTextStream with a ByteArray buffer.<br>        super().__init__(self.buffer, QIODevice.ReadWrite)<br>        # The default codec is codecForLocale, which might vary with<br>        # the platform, so set a codec here for consistency. UTF-16<br>        # should entail minimal or no conversion on input or output.<br>        self.setCodec( QTextCodec.codecForName('UTF-16') )<br>    def pos(self):<br>        self.flush()<br>        return super().pos()<br>    def cpos(self) :<br>        return int( self.pos()/2 )<br>    def rewind(self):<br>        self.flush()<br>        self.seek(0)<br>    def writeLine(self, str):<br>        self << str<br>        self << '\n' <br></div></div></div>