• 7783阅读
  • 7回复

QTextedit怎么才能移动一个字节而不是一个字符 [复制链接]

上一主题 下一主题
离线coffeegg1985
 

只看楼主 倒序阅读 楼主  发表于: 2010-07-07
我在做telnet终端,但是QTextCursor::movePosition()这个函数让我很头疼,我向右移动插入符的时候,他经常是移动一个字符而不是一个字节,譬如有"a1啊2"这个字符串,我第一次向右移动是插入符到"1"前,再向右依次是到"啊"前,但是再向右移动一次就直接到"2"前,移了2个字节,这样对telnet返回的报文无法正常解析.还有QTextCursor::deleteChar()也有这个问题...
离线dbzhang800

只看该作者 1楼 发表于: 2010-07-07
引用楼主coffeegg1985于2010-07-07 10:17发表的 QTextedit怎么才能移动一个字节而不是一个字符 :
我在做telnet终端,但是QTextCursor::movePosition()这个函数让我很头疼,我向右移动插入符的时候,他经常是移动一个字符而不是一个字节,譬如有"a1啊2"这个字符串,我第一次向右移动是插入符到"1"前,再向右依次是到"啊"前,但是再向右移动一次就直接到"2"前,移了2个字节,这样对telnet返回的报文无法正常解析.还有QTextCursor::deleteChar()也有这个问题...


我对Telnet 一窍不通,只针对编码简单说两句,不当之处请指正。

首先Qt中 QString 采用的是 unicode (windows下utf16,linux下utf32)

你提到的QTextedit中的字符串,"a1啊2",其中每个字符都是多个字节(2或4取决于你的系统),并不是只有汉字是多字节。(你确定你想让“a”,"1"什么的都需要每次移动一个字节?)

从的叙述中可猜测,你提到的编码是 “GBK”(如果utf8的话,你会提3字节而不会是2), "啊" 的GBK的字节和 Unicode 的字节是不一样的,即使按字节你确定是你要的么?
离线coffeegg1985

只看该作者 2楼 发表于: 2010-07-07
回 1楼(dbzhang800) 的帖子
谢谢你的回复
编码细节不是很懂,但是默认情况下应该是英文字母占一个字节,中文占两个字节.
我现在用QTextedit模拟VT100终端来使用telnet,遇到很多问题
QTextedit中调用的QTextCursor默认向右移动一位是移动一个字符(也就是说中文移动两个字节)
但是telnet下发的命令是向右移动多少个字节,而不是多少个字符,也就是说报文中并不考虑是否中文之类的,我能想到的解决方案就是一次一次判断插入符右边的字符是否是中文,然后再移动光标,移动一次算2个字节
还有我再问下,QTextedit怎么使用覆盖模式来写文档,overWrite这个参数好像只对键盘输入有效果,我在代码中覆盖模式写入文档不知道用那个函数,只有insertxxxx之类的函数可以写入,所以导致我每次都要先删除后面的字再写入.
离线coffeegg1985

只看该作者 3楼 发表于: 2010-07-07
回 1楼(dbzhang800) 的帖子
另外,我如果在qt中用其他编码,譬如utf8什么的,那么这些光标移动就没问题,但是,代价是显示的时候一个中文被拆成两个乱字符...
离线dbzhang800

只看该作者 4楼 发表于: 2010-07-07
按你的叙述提两点:
1. 你 Telnet 涉及到的编码都是 GBK, 而要记住你TextEdit 中的都是 Unicode (具体点utf16)
    这两个的关系要搞清

2. 感觉你方向走反了,不应该想着怎么让TextEdit 遇到中文时每次移动半个字,而要考虑怎么让你的telnet遇到中文时不会出现半个字的情况
离线watera
只看该作者 5楼 发表于: 2010-07-08
纠正1楼:
使用utf-8,英文是1字节,汉字2,3字节都有可能
离线dbzhang800

只看该作者 6楼 发表于: 2010-07-08
引用第5楼watera于2010-07-08 14:02发表的  :
纠正1楼:
使用utf-8,英文是1字节,汉字2,3字节都有可能



呵呵,上面我提到 3 是因为汉字用utf-8表示时基本都是3字节(可能有4字节,但不会有2字节)

utf-8 的理论长度最长是6字节,但由于unicode与iso10646达成共识,只使用21位编码空间,于是 utf-8 的有效的字节数可以是(1、2、3、4)

当然:如果把所用的字符都限制在 unicode 的 BMP 的话(即16位编码空间),用utf-8表示时长度不超过3字节
离线乙醚

只看该作者 7楼 发表于: 2011-09-15
回 楼主(coffeegg1985) 的帖子
楼主有没有解决这个问题啊,我用readLine()时也遇到这种问题,希望中文算两个,英文和数字算一个
快速回复
限100 字节
 
上一个 下一个