как получить один символ из строки 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;
}

1

Решение

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

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

ПОДСКАЗКА: Windows также имеет NormalizeString () функция, которую вы можете использовать, чтобы убедиться, что символы из файла соответствуют вашим ожиданиям. Это может быть использовано для преобразования символов, которые имеют несколько представлений в Юникоде, в их «каноническое» представление.

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

2

Другие решения

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

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

0

По вопросам рекламы [email protected]