Как получить один символ из строки URDU в кодировке UTF-8, записанной в файле?

Я работаю над переводом / транслитерацией урду хинди. Моя цель - перевести предложение на урду на хинди и наоборот, я использую программное обеспечение 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;
   }

2 ответа

Решение

Предполагая, что вы находитесь в Windows, самый простой способ получить "полезные" символы - это прочитать больший фрагмент файла (например, строку или весь файл) и преобразовать его в UTF-16 с помощью функции MultiByteToWideChar. Используйте псевдо-кодовую страницу CP_UTF8. Во многих случаях декодирование UTF-16 не требуется, но я не знаю, на какие языки вы ссылаетесь; если вы ожидаете символы не-BOM (с кодами выше 65535), вы можете рассмотреть возможность декодирования UTF-16 (или самостоятельно декодировать UTF-8), чтобы избежать необходимости иметь дело с символами из 2 слов.

Вы также можете написать свой собственный декодер UTF-8, если хотите. Это не сложно, и просто требует некоторого бит-жонглирования, чтобы извлечь правильные биты из входных байтов и собрать их в окончательное значение Юникода.

СОВЕТ: Windows также имеет функцию NormalizeString(), которую вы можете использовать, чтобы убедиться, что символы из файла соответствуют вашим ожиданиям. Это можно использовать для преобразования символов, имеющих несколько представлений в Юникоде, в их "каноническое" представление.

РЕДАКТИРОВАТЬ: если вы читаете о кодировке UTF-8, вы можете легко увидеть, что вы можете прочитать первый байт, выяснить, сколько еще байтов вам нужно, также прочитать их и передать все это в MultiByteToWideChar или свой собственный декодер (хотя ваш собственный декодер может просто читать из файла, конечно). Таким образом, вы могли бы действительно "читать по одному символу за раз".

Классы 'w' не читают и не записывают UTF-8. Они читают и пишут UTF-16. Если ваш файл находится в формате UTF-8, чтение его с помощью этого кода приведет к бреду.

Вам нужно будет прочитать его как байты, а затем преобразовать или записать в UTF-16.

Другие вопросы по тегам