2011年9月24日 星期六

如何透過Qt讀取Unicode的檔案

今天試了一下,如何讀取Unicode的檔案,看起來,Qt都已經把它做好了,跟讀取ANSI的檔案方式沒有什麼差別。

這裡寫了一個例子,
Info.uni是一個Unicode(UTF-16)的檔案,執行這一個檔案會,
會多出一個CopyInfo.uni(UTF-16)的檔案與Info.txt(ANSI)

另外,因為,在Qt中,讀取UTF-16與ANSI的方式是一樣的,所以,
當你把Info.uni的內容改成ANSI的話,同樣程式可以work,
並且一樣會產生出CopyInfo.uni(UTF-16)的檔案與Info.txt(ANSI)

範例程式碼如下:
main.cpp

#include <QFile>
#include <QDebug>
#include <QTextStream>
#include <QStringList>

int main(int argc, char *argv[])
{
QFile UnicodeFile("Info.uni");
QFile CopyUnicodeFile("CopyInfo.uni");
QFile ANSIFile ("Info.txt");
QStringList ContainStringList;

//
// Try to open Unicode file
//

if (!UnicodeFile.open(QIODevice::ReadOnly)) {
qDebug () << "Open UnicodeFile error!!";
return -1;
}

//
// Create a QTextStream for UnicodeFile
//

QTextStream UnicodeOut (&UnicodeFile);

//
// Insert all the contain into ContainStringList
//

while (!UnicodeOut.atEnd()) {
//qDebug() << UnicodeOut.readLine();
ContainStringList << UnicodeOut.readLine();
}

UnicodeFile.close();

//
// Try to create a unicode file
//

if (!CopyUnicodeFile.open(QIODevice::WriteOnly)) {
qDebug() << "Open CopyUnicodeFile error!!";
return -1;
}

QDataStream CopyUnicodeData(&CopyUnicodeFile);

//
// Create Unicode header (FFFE) for CopyInfo.uni
//

CopyUnicodeData << (quint8) 0xFF << (quint8) 0xFE;
CopyUnicodeFile.close();

if (!CopyUnicodeFile.open(QIODevice::Append | QIODevice::Text)) {
qDebug() << "Open CopyUnicodeFile error!!";
return -1;
}

QTextStream CopyUnicodeOut (&CopyUnicodeFile);
CopyUnicodeOut.setCodec("UTF-16");

//
// Insert all the contain from ContainStringList into CopyInfo.uni (Unicode decode)
//

for (int i = 0; i < ContainStringList.size();) {
CopyUnicodeOut << ContainStringList.at(i++);
if (i < ContainStringList.size()) {
CopyUnicodeOut << endl;
}
}

CopyUnicodeFile.close();

//
// Try to create a ANSI file
//

if (!ANSIFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "Open ANSIFile error!!!";
return -1;
}

//
// Try to create a ANSI file
//

QTextStream ANSIOut (&ANSIFile);

//
// Insert all the contain from ContainStringList into Info.txt (ANSI decode)
//

for (int i = 0; i < ContainStringList.size();) {
ANSIOut << ContainStringList.at(i++);
if (i < ContainStringList.size()) {
ANSIOut << endl;
}
}

ANSIFile.close();

return 0;
}


參考資料:
QString Class Reference
建立一個Unicode檔案的簡單程式

沒有留言: