LINUX.ORG.RU

C++ чтение из файла с кодировкой UTF8


0

0

Почему не работает, например, следующий код:

#include <iostream>
#include <fstream>
#include <string>
#include <locale>
using namespace std;

main()
{
  setlocale(LC_ALL, "");
  wifstream wordbase ("words.txt");
  wstring word;
  while (!wordbase.eof())
  {
    wordbase >> word;
    wcout << word <<endl;
  }
return 0;
}
В файле words.txt несколько слов на русском, кодировка - utf8. При выполнении программа говорит:

terminate called after throwing an instance of 'std::ios_base::failure' what(): basic_filebuf::underflow invalid byte sequence in file Aborted

Что делать? Если везде заменить wifstream,wcout и т.п. на ifstream,cout..., то конкретно данная программа будет работать правильно, но мне надо, чтобы с отдельными символами введённых строк можно было работать.

☆☆☆☆☆

Добавь locale::global( locale( "" ) ); перед wifstream wordbase ("words.txt");

summatus
()

Вообще-то по стандарту один символ UTF-8 занимает от одного до четырёх байт. А теоретически может доходить и до шести.

zzf
()
Ответ на: комментарий от zzf

Так что, строго по одному байту и ручками склеивать.

zzf
()

Для utf8 не нужен wchar_t. Вообще.

legolegs ★★★★★
()

/**********************************************************************************************/
int UtfToUniChar( char *str, int* chPtr )
{
	int byte = *((unsigned char *) str);
	if( byte < 0xC0 )
	{
		*chPtr = (int) byte;
		return 1;
	}
	else if( byte < 0xE0 )
	{
		if( ( str[ 1 ] & 0xC0 ) == 0x80 )
		{
			*chPtr = (int) (((byte & 0x1F) << 6) | (str[1] & 0x3F));
			return 2;
		}

		*chPtr = (int) byte;
		return 1;
	}
	else if( byte < 0xF0 )
	{
		if( ( ( str[ 1 ] & 0xC0 ) == 0x80 ) && ( ( str[ 2 ] & 0xC0 ) == 0x80 ) )
		{
			*chPtr = (int) ( ( ( byte & 0x0F ) << 12 ) |
				( ( str[ 1 ] & 0x3F ) << 6 ) | ( str[ 2 ] & 0x3F ) );

			return 3;
		}

		*chPtr = (int) byte;
		return 1;
	}

	*chPtr = (int) byte;
	return 1;
}


...

	char* next = buffer;
	for( int i = 0 ; *next ; ++i )
	{ 
		int ch = 0;
		next += UtfToUniChar( next, &ch );

...

это чтоб прочитать посимвольно utf8

Unknown
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.