2012-09-29 50 views
1

我正在研究烏爾都語印地文翻譯/音譯。我的目標是將烏爾都語句子翻譯成印地語,反之亦然,我正在使用visual C++ 2010軟件和C++語言。我在保存爲UTF-8格式的文本文件中寫了一個烏爾都語句子。現在我想從該文件中逐一獲取單個字符,以便我可以將其轉換爲等效的印地語字符。當我嘗試從輸入文件中獲取單個字符並在輸出文件中寫入此單個字符時,我在輸出文件中找到了一些未知的難看的字符。請用適當的代碼幫助我。我的代碼如下如何從UTF-8編碼的URDU字符串中獲取單個字符寫入文件?

#include<iostream> 
#include<fstream> 
#include<cwchar> 
#include<cstdlib> 
using namespace std; 
void main() 
{ 
wchar_t arry[50]; 
wifstream inputfile("input.dat",ios::in); 
wofstream outputfile("output.dat"); 

if(!inputfile) 
{ 
    cerr<<"File not open"<<endl; 
    exit(1); 
} 

while (!inputfile.eof())   // i am using this while just to 
            // make sure copy-paste operation of 
            // written urdu text from one file to 
            // another when i try to pick only one character 
            // from file, it does not work. 

{ inputfile>>arry; } 
    int i=0; 
    while(arry[i] != '\0')   // i want to get urdu character placed at 
            // each-index so that i can work on it to convert 
            // it into its equivalent hindi character 
{ outputfile<<arry[i]<<endl; 
     i++; } 
    inputfile.close(); 
outputfile.close(); 
cout<<"Hello world"<<endl; 
    } 

回答

2

假設你在Windows上,獲取「有用」字符的最簡單方法是讀取文件的大塊(例如一行或整個文件),並使用MultiByteToWideChar將其轉換爲UTF-16功能。使用「僞」代碼頁CP_UTF8。在很多情況下,解碼UTF-16並不是必需的,但我不知道你所指的語言;如果您期望非BOM字符(代碼大於65535),您可能需要考慮解碼UTF-16(或自己解碼UTF-8)以避免必須處理2個字的字符。

如果您願意,也可以編寫自己的UTF-8解碼器。這並不複雜,只需要一點點雜耍即可從輸入字節中提取適當的位並將它們組合成最終的unicode值。

提示:Windows還有一個NormalizeString()函數,您可以使用它來確保文件中的字符符合您的期望。這可用於將具有多個Unicode表示的字符轉換爲其「典型」表示。編輯:如果你閱讀了UTF-8編碼,你可以很容易地看到你可以讀取第一個字節,計算出你需要多少字節,讀取這些字節,並將整個事物傳遞給MultiByteToWideChar或你自己的解碼器(儘管你自己的解碼器可以從文件中讀取,當然)。這樣你可以真正做到「一次只讀一個字符」。

+0

非常感謝您的指導,請指導我如何製作我自己的utf-8解碼器? –

+0

非常感謝您的指導,請指導我如何製作我自己的utf-8解碼器? URDU文本(巴基斯坦國家語言)以2字節字符表示爲unicode,每個字符佔用11位,因此每個字符以兩個字節編碼。我不明白,如果我從烏爾都代碼點值(11位unicode urdu字符)中刪除編碼的額外unicode位,那麼我怎樣才能把這11位置於另一個文件(已經保存爲utf-8格式)。我希望你明白我有什麼困惑 –

0

'w'類不讀寫UTF-8。他們讀寫UTF-16。如果你的文件是UTF-8,用這段代碼讀取它會產生亂碼。

您需要將它作爲字節讀取,然後將其轉換,或者首先將其寫入UTF-16。

+0

如何讀取urdu文本文件的字節數 –