如何从文件中写入UTF-8编码的URDU字符串中获取单个字符?

时间:2012-09-29 16:51:59

标签: c++ visual-c++ wofstream wifstream

我正在从事乌尔都语印地语翻译/音译。我的目标是将乌尔都语句子翻译成印地语,反之亦然,我使用的是带有c ++语言的visual c ++ 2010软件。我在保存为UTF-8格式的文本文件中写了一个乌尔都语句子。现在我想从该文件中逐个获取单个字符,以便我可以将其转换为等效的印地语字符。当我尝试从输入文件中获取单个字符并在输出文件中写入此单个字符时,我会在输出文件中放置一些未知的丑陋字符。请帮助我正确的代码。我的代码如下

#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 个答案:

答案 0 :(得分:2)

假设您使用的是Windows,获取“有用”字符的最简单方法是读取较大的文件块(例如一行或整个文件),并使用{{将其转换为UTF-16 3}}功能。使用“伪”代码页CP_UTF8。在许多情况下,不需要解码UTF-16,但我不知道你所指的语言;如果您期望非BOM字符(代码高于65535),您可能需要考虑解码UTF-16(或自己解码UTF-8)以避免必须处理双字字符。

如果您愿意,也可以编写自己的UTF-8解码器。它并不复杂,只需要一些位杂耍就可以从输入字节中提取适当的位并将它们组合成最终的unicode值。

提示:Windows还具有MultiByteToWideChar功能,您可以使用该功能确保文件中的字符符合您的预期。这可以用于将具有Unicode中的多个表示的字符转换为其“规范”表示。

编辑:如果您阅读NormalizeString()编码,您可以很容易地看到您可以读取第一个字节,找出您需要多少字节,也可以读取这些字节,并将整个内容传递给MultiByteToWideChar或者你自己的解码器(当然你自己的解码器只能读取文件)。这样你就可以真正做到“一次读一个字符”。

答案 1 :(得分:0)

'w'类不读写UTF-8。他们读写UTF-16。如果您的文件是UTF-8,使用此代码读取它将产生乱码。

您需要将其作为字节读取,然后将其转换,或者首先将其写入UTF-16。