1

我正在研究乌尔都语印地语翻译/音译。我的目标是将乌尔都语句子翻译成印地语,反之亦然,我正在使用 Visual c++ 2010 软件和 c++ 语言。我在保存为 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;
   }
4

2 回答 2

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 或您自己的解码器(虽然您自己的解码器当然可以从文件中读取)。这样你就可以真正做到“一次读取一个字符”。

于 2012-09-29T17:17:16.297 回答
0

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

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

于 2012-09-29T16:56:05.347 回答