天天看點

Qt中多語言及字型的分析

     目前工作在Qtopia2.2.0中,項目要求實作多語言,目前的需求是要實作波斯文。而因為我對波斯文一點都不了解,是以花了不少時間在這上面,現在算是雲開霧散了。寫點心得,即記錄我的所得也想和大家分享一下。

     字型

     字型是同一個unicode(或是其他編碼,也需要将其轉換為unicode)值,在不同的字型中顯示給使用者的形态不一樣,比如abc這些字母,在Times字型或是相關字型中,表現出來的形态都是abc。而對于波斯文中,abc這些字元在波斯文對于的字型中,abc三個字母的形态為蝌蚪形狀了。是以如果要将某個Qtopia的平台使用的語言改變為波斯文,那麼字型也必須相應的修改。(因為對unicode及其他編碼格式及他們的關系了解不夠,是以造成我之前的一些困擾)

     編碼方式

     國際通用的unicode包括了所有的字元的編碼,然後在不同的國家或是地區或是組織,有自己的編碼,比如中國大陸有GB2312、台灣有Big5、日本有EUC-JP等等,表示阿拉伯文的是ISO 8895-6等等。而因為unicode是國際通用的編碼,幾乎包括所有的字元,Qt使用unicode編碼,是以在qt中需要将unicode編碼和其他編碼之前的轉換。

    Qt中的國際化tr()

    Qt中的tr是将指定的字元串翻譯成本地語言。它是怎麼實作的呢?經過閱讀代碼,其過程如下(下面是Qt2的過程,Qt4大緻相同):

    1)tr函數會直接調用到QApplication::translate()函數

    2)在QApplication::translate()函數中,會找到根據所有的QTranslater對象來翻譯指定的源字元串。在QT中,使用lupdate和lrealse工具生成的翻譯檔案*.qm,每一個qm檔案對于一個QTranslater對象。是以這一步是在所有的*.qm檔案中查找。如果找到,則直接傳回翻譯的文本

    3)當在*.qm中找不到該字元串的時候,再根據目前的文本編碼模式将文本轉換為unicode編碼傳回(目前的文本編碼模式是QTextCodec的子類的對象)

     4)如果在第3步中不能轉換為有效的unicode值,那麼直接傳回在原來的字元串。

說明:在Qt2中,每一個Application隻有一個預設的文本編碼方式,而在Qt4中,有本地的編碼方式,有翻譯的編碼方式。他們的作用是不同的。

繼續閱讀