2012-03-22 14:00
175人阅读
评论(0)
代码如下:如果不不设全局的字符集是utf-8,那么网上一般的方法是可以转的。如下程序中 #define DD 1的情况下;但是如果设置了全局的utf-8,再用以前的方法:
QByteArrayba=aaa.toLatin1();
constchar*c_str=ba.data();
PS:c_str所指向的内存单元,如果你想长时间使用你应该复制出来,要不可能过数行代码后,你再读你的数据,c_str所指向的内存单元就不是你以前读的内容了。函数返回的指针临时变量,不能长时间使用!!!!!!!
具体代理在本贴最后补充出来:
等网上类似的方法,都会出现转代汉字不成功,但能转代ASICC码的情况。汉字都成了问号的ASICC码63。这是因为没有用对方法没有用转换utf-8码的方法。
转码是件很复杂的事。
#include
#include
#include
#include
#include
#defineDD0
intmain(intargc,char*argv[])
{
QApplicationapp(argc,argv);
#ifDD
//没有设置全局的是utf-8字符
#else
QTextCodec*codec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
QFontfont;
font.setFamily(("WenQuanYiZenHei"));
font.setPointSize(12);
app.setFont(font);
app.setFont(font);
#endif
QStringaaa="你好a1234";
QStringbbb="哈哈afaf394的AAA";
#ifDD
QByteArrayba=aaa.toLatin1();
constchar*c_str=ba.data();
printf("c_str:%s:size=%d\n",c_str,strlen(c_str));
char*p;
p=(char*)c_str;
printf("p=%d\n",*p);
p++;
printf("p=%d\n",*p);
QStringddd(c_str);
qDebug()<
#else
char*ad=aaa.toUtf8().data();
char*bb=bbb.toUtf8().data();
printf("ad=%s,size=%d\n",ad,strlen(ad));
printf("df=%s,size=%d\n",bb,strlen(bb));
#endif
QPushButtonccc("AWQWQwq你了");
ccc.show();
returnapp.exec();
}
以下是在网上找的,感觉很好,可以一块理解:
这个好像就是用几种不同的字符,但不会出错,不像我们一种都搞不定
Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK
#include
#include
#include
#include
void MainWindow::on_pushButton_clicked()
{
/*
只有8位编码的才需要tr, unicode不要tr
gb2312是GBK的子集,通常设成哪个都一样的
所谓的QString转char*,结果并不相同,根据编码格式不同而不同
QString转unicode,不用转,QString本身就是unicode
QString的根本是QChar数组,但不是以0结尾,有大小,QChar的根本是ushot
Qt中unicode声明:可以用wchar_t,也可以用ushot,没有WCHAR
QByteArray可以理解为char类型的动态数组,有大小,不是以\0结尾
*/
/*
ui创建1个列表框QListWidget,和1个按钮即可
用windows记事本分别创建4种文件,本例可直接打开
ANSI:没有文件头,2字节/汉字,1字节/英文
UTF-8:文件头[0xEF,0xBB,0xBF],3字节/汉字,1字节/英文
Unicode:文件头[0xFF,0xFE],2字节/汉字,2字节/英文
Unicode big endian :文件头[0xFE,0xFF],同Unicode,字节序相反
QString转char*的规则同上;
*/
/*
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
如下使用想要得到正确结果必须使用类似以上的语句
str = tr("显示中文");
但以下这个可以直接使用
strText = QString::fromLocal8Bit("显示中文");
*/
ui->list->addItem(QString::fromLocal8Bit("--------显示中文----------"));
QString strFileName = QFileDialog::getOpenFileName(this, tr("OpenFile"), ".", tr("Image Files(*.*)"));
if(strFileName.length() == 0)
{
ui->list->addItem(tr("You didn't select any files."));
return;
}
// 打开文件
QFile *pFile = new QFile(strFileName);
if (!pFile->open(QFile::ReadOnly))
{
ui->list->addItem(tr("open file fai