qt讀取中文文件的測試

轉載自:http://blog.chinaunix.net/uid-8743735-id-2454902.html

讀取中文文件內容的測試
有3種因素 
1文件的編碼格式(是utf8格式和非utf8格式) 
2程序裏面轉換得到內容的方式(QString::fromLocal8Bit 和 codec->toUnicode) 
註明一下 這裏 QTextCodec* pcodec = QTextCodec::codecForLocale();
3不同的字體,假設知道有種字體可以正確顯示中文這裏舉例是Sans Serif字體和 不設置字體
因爲我最先考慮的不是字體 所以順序如下
1.1 不是utf8文件  + QString::fromLocal8Bit  = 方塊
1.2 不是utf8文件  + codec->toUnicode = 亂碼
2.1 是utf8文件  + QString::fromLocal8Bit  = 方塊
2.2 是utf8文件  + codec->toUnicode  = 亂碼 
上面都沒有考慮字體 這時候 熱心的網友提醒我注意字體 我就分設置字體和不設置字體
3.1 設置字體 + 不是utf8文件  + QString::fromLocal8Bit = 亂碼
3.2 設置字體 + 不是utf8文件  + codec->toUnicode = 亂碼
3.3 設置字體 + 是utf8文件  + codec->toUnicode  = 亂碼 
3.4 設置字體 + 是utf8文件  + QString::fromLocal8Bit  = 終於出來漢字了
設置字體
  QFont font;
  font.setPointSize(16);
   font.setFamily(("Sans Serif"));
  sceneryInfo->txtLabel->setFont(font);
是utf8文件,這個要自己用編輯器轉
sceneryInfo->txtLabel->setText(QString::fromLocal8Bit(file.readAll()));
漢字出來了。。。。

不知道我表達清楚了沒有呢 
QFont font;
font.setPointSize(16);
font.setFamily(("Sans Serif"));
sceneryInfo->txtLabel->setFont(font);
一定要記得setPointSize一下哦
    QFile file(strTxt);
    //QTextCodec* pcodec = QTextCodec::codecForName("GBK");
 //QTextCodec* pcodec = QTextCodec::codecForName("gb18030");
 //QTextCodec* pcodec = QTextCodec::codecForName("GB2312");
 //QTextCodec* pcodec = QTextCodec::codecForName("utf8");
 //QTextCodec* pcodec = QTextCodec::codecForName("ISO 8859-1");
 QTextCodec* pcodec = QTextCodec::codecForLocale();
 if(NULL==pcodec)
 {
  QMessageBox::information(this,tr("notice"),tr("the textcode is error"));
  return;
 }
 else
 //QTextCodec* pcodec = QTextCodec::codecForLocale(); 
    if (file.open(IO_ReadOnly))//QFile::ReadOnly | QFile::Text
 {
  //QTextStream txtmp(&file);
//設置字體
  QFont font;
  font.setPointSize(16);
   font.setFamily(("Sans Serif"));
  sceneryInfo->txtLabel->setFont(font);
//QMessageBox::information(this,tr("notice"),QString::fromLocal8Bit("你好"));//file.readAll() QString::fromLocal8Bit
//pcodec->toUnicode("你好") 亂碼
//QString::fromLocal8Bit("你好") 方塊
//QString::fromUtf8("你好") 也是方塊
//使用fromLocal8Bit
  sceneryInfo->txtLabel->setText(QString::fromLocal8Bit(file.readAll()));
//sceneryInfo->txtLabel->setText(QString::fromUtf8(file.readAll())); 
//sceneryInfo->txtLabel->setText(pcodec->toUnicode(file.readAll()));
 }
 else
  printf("leedebug open error\n");
 
 
 
1. 保存中文的文件需要是 unicode 格式.
2. 使用 QString 來保存讀取出來的數據(因爲QString內部使用的unicode機制,如果你使用 char 那麼需要一次轉換).
3. 由於很多字體並不支持 全部unicode編碼(或者根本不支持unicode編碼).那麼 unicode 碼的中文字還是不能顯示的.所以你需要設置 QFont 的 family 是支持中文unicode碼的字庫.比如 : 宋體(注意:宋體在非windows系統下的具體名稱).
以上的方法對其他全角字也支持,比如韓文.

1. windows下的文本編輯器以 unicode 碼保存文件時,採用的是 utf16 的寬字符形式.(有時候可以在windows下編輯好需要的文本文件)
2. QString 的內部編碼也是 utf16.
3. QString直接保存 utf16 編碼的信息不需要使用QString::fromLocal8Bit 轉換就可以成功顯示.
 
由於以上因素,我建議文件保存成 utf16 的形式.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章