• 7275阅读
  • 9回复

[提问]中文化问题有时可以中文,有时不行,希望大家指点 [复制链接]

上一主题 下一主题
离线windytwang
 

只看楼主 倒序阅读 楼主  发表于: 2006-03-21
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
还是中文化的问题
我参考了qtcn上关于中文化的文章,以及XChinux的详细答复但是一直还没有解决这问题,现在把问题写出来,希望得到指点帮助。

中文化能正常传的方法:
Client client;
QTextEdit chat;
QString str;

server端
QTextStream os( &client )
os << chat.text();

client端
Client client;
is >> str;
chat.setText( QString::fromUtf8( str ) );




但是因为我想定制每个数据包的大小,所以将qtextstream传换成了qsocket的writeBlock,然后试了一个小时,各种方法都试了都还是不行,希望大家指点指点

QSocket *socket;
server端
QString str=chat.text();
char *block = new char[1024];
memcpy( block,str.ascii(),str.length() );(str.toUnicode()还是不行)
socket->writeBlock( block,1024 );
delete block;

client端
socket->readBlock( block,1024 );
str = QString::fromUtf8( block ); (fromLocal8Bit还是不行)
chat.setText( str );

另外问一下qtextedit平时输入的中文是unicode还是gb格式的呢?
[ 此贴被windytwang在2006-03-24 12:29重新编辑 ]
离线windytwang

只看该作者 1楼 发表于: 2006-03-22
谁能解释一下吗?谢谢
离线windytwang

只看该作者 2楼 发表于: 2006-03-24
又尝试了几种方法还是不行,继续求助中
离线obrire

只看该作者 3楼 发表于: 2006-03-24
你的客户端是什么系统?如果你windows,有可能是Utf-8也可能是GB2312或GBK,这需你额外处理.
以前我们也遇到过,本以为Windows的分区是GB2312,可一直显示不正常,后来发现,XP/2003,他可以使用Utf-8
,改用Utf-8就可以正常mount了.
还有,不同的Linux发行版,就在X下Console状态,支持字符集也是五花八门.请你仔细查看.
确保你的服务端和客户端都正常使用了Locale设置,并且传输过程都使用了unicode,就可以正常显示的.
否则,你都不知道,你现在在你的平台下的编辑框中输入的是最后变成了什么编码.

export LC_ALL=zh_CN;
确保X或QT的Framebuffer使用的字库中有Locale的字符集.
传输统一为unicode.

QByteArray encodedString = "管理服务器平台";
QTextCodec *codec = QTextCodec::codecForName("GB2312");
QString string = codec->toUnicode(encodedString);
setWindowTitle(string);

这能正常工作,在QByteArray的初始化时,是在XP SP2下,正确输入的GB2312的字符集"管理服务器平台"
所以,在QTextCodec时,表示输入正确编码为GB2312
所以 string在codec后,变成了标准的utf8字符集.就可正常使用了.

而后,在工作时,由于我的系统存在有utf8字符集,所以可以正常显示.
当然,如果没有,照样是乱码.不过是规则一点,就是没有字符集的哪种.
离线obrire

只看该作者 4楼 发表于: 2006-03-24
正常模式下,输入的是GB,不是Utf8,所以你的要出错了
离线windytwang

只看该作者 5楼 发表于: 2006-03-24
非常感谢,我的开发平台是fedore4 qt版本3.3.4
1,linux下在qtextedit输入的中文也是Utf-8也可能是GB2312或GBK都有可能吗?
2,Locale设置,要设置成什么呢?对local的原理可以解释下么?
3,"不同的Linux发行版,就在X下Console状态,支持字符集也是五花八门.请你仔细查看.",如何查看呢?

再次感谢.
离线windytwang

只看该作者 6楼 发表于: 2006-03-24
另外传输时我是调用writeBlock();参数是const char*,如何将unicode传为const char*呢?谢谢
离线obrire

只看该作者 7楼 发表于: 2006-03-24
1. 如果发送端已经encode成了utf8,则后端接收显示时,可直接采用utf8方式,一般而言,纯中国人用的系统
都带有这类字库.
2. 如果想查看你的ENV设置,可运行set查看,如果没有LC_ALL,就手动运行export LC_ALL=zh_CN
一般而言,Unix/Linux在默认状态下是LC_ALL=C,包括本地设置LC_LOCALE=C
如我的SuSE 10.1, 由于X下要zh_CN,而login时,本要显示中文(init 3),提示就变成了乱码,这没关系
如果LC_ALL=C,则提示就正常显示为ANSI C的英文提示.

3. 在X-Console下,按右键是有字符集设置,看看你当前使用的是什么字符集

举例说明:以前我在Windows下写的中文源码,可以在VS.NET下用Cl编译,也可以正常显示中文
当我们拿到arm的开发板上去时,在linux下编译时,gcc不能识别,为什么呢?写字板也可以保存非
英文字符为unicode码的.这时如果源码中的中文不是标准的GB,则gcc会报错.
而且在开发板上显示乱码.当以纯文本输入后,在vi下,虽然看起来是乱码,但这是正确的.只是输入
是正确的GB码,以QByteArray串读入,而encode时指定的是GB,这时编译后的就是正常的utf8码了.

而qte最早的版本中,fonts可以支持GBK,GB2312,只是当时于明俭他们设计时,字符集不是很好看.
这方面你可以在qt核心库的源码中看到.所以在开发板上显示时,1.7的Qtopia中文字符一个大一个小
很不好看.因此后来有同事专门制作了新的中文字库.如果有TrueType就更好了,Windows下的本可以
拿过去用,但有版权问题.

QString stores a string of 16-bit QChars, where each QChar stores one Unicode 4.0 character. Unicode is an international standard that supports most of the writing systems in use today. It is a superset of ASCII and Latin-1 (ISO 8859-1), and all the ASCII/Latin-1 characters are available at the same code positions.

QByteArray QTextCodec::convertFromUnicode ( const QChar * input, int number, ConverterState * state ) const [pure virtual protected]

QByteArray fromUnicode ( const QString & str ) const

以上函数可以将unicode码转换回GB或其它本地字符集.
离线obrire

只看该作者 8楼 发表于: 2006-03-24
QByteArray encodedString = "雪皓媒体工作室";
QTextCodec codec = QTextCodec::codecForName("GB2312");
QString   string = codec->toUnicode(encodedString);
//statusBar()->showMessage(/*tr("Status Bar")*/string);
 
QString uString = string;
QTextCodec *new_codec = QTextCodec::codecForName("GB2312");
QByteArray gbString = new_codec->fromUnicode(uString);
statusBar()->showMessage(/*tr("Status Bar")*/gbString.data());

QFile file("out.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
  return;

file.write(gbString.data(), qstrlen(gbString.data()));     // write to stderr
file.close();

以上代码全面测试了有关中文化的问题.恕以后不再回复有关i18n的问题.
在statusBar看到的是GB2312的编码串,所以显示为乱码.
而在out.txt中,将从unicode中还原出来的GB2312字符,便是"雪皓媒体工作室"
你可以在支持GB2312的平台下打开(如windows/unix/linux LC_LOCALE=zh_CN)
且有中文字库.
以上内容,望对朋友们有所帮助.
离线windytwang

只看该作者 9楼 发表于: 2006-03-27
好的,十分感谢。我下去再好好自己调试调试
快速回复
限100 字节
 
上一个 下一个