Первое, что нужно сделать, это определить, находится ли ваш ввод в UNICODE. Сделайте это, попытавшись прочитать ваш ввод как UNICODE и посмотреть, не искажены ли результаты.
FILE * fp = _wfopen( L"fname",L"r" );
wchar_t buf[1000];
while( fgetws(buf,999, fp ) ) {
fwprintf(L"%s",buf);
}
Если с выводом все в порядке, у вас есть файл UNICODE, если он искажен, это UTF-8
Если у вас есть UTF-8, вам придется конвертировать в Unicode, чтобы упростить обработку.
// convert UTF-8 to UNICODE
void String2WString( std::wstring& ws, const std::string& s )
{
ws.clear();
int nLenOfWideCharStr = MultiByteToWideChar(CP_ACP, 0,
s.c_str(), s.length(), NULL, 0);
PWSTR pWideCharStr = (PWSTR)HeapAlloc(GetProcessHeap(), 0,
nLenOfWideCharStr * sizeof(wchar_t)+2);
if (pWideCharStr == NULL)
return;
MultiByteToWideChar(CP_ACP, 0,
s.c_str(), s.length(),
pWideCharStr, nLenOfWideCharStr);
*(pWideCharStr+nLenOfWideCharStr ) = L'\0';
ws = pWideCharStr ;
HeapFree(GetProcessHeap(), 0, pWideCharStr);
}
// read UTF-8
FILE * fp = fopen( "fname","r" );
char buf[1000];
std::string aline;
std::wstring wline;
std::vector< std::wstring> vline;
while( fgets(buf,999, fp ) ) {
aline = buf;
String2WString( wline, aline );
vline.push_back( wline );
}
Выше предполагается, что вы находитесь в Windows. В Unix применяется та же идея, и код очень похож. Тем не менее, я не нахожу это настолько простым, поэтому я позволю эксперту UNIX предоставить подробности.