std::stoi
требует обработки исключений следующим образом:
int testIntVal;
try
{
testIntVal = std::stoi(strTest);
std::cout << "Int Value of first character is : " << testIntVal << std::endl;
}
catch(...)
{
std::cout << "not a valid integer\n";
}
Это неправильный способ проверки кодировки файлов.
Вы должны проверить BOM (Byte Order Mark), если файл имеет BOM, вы можете быть уверены в формате.
Если файл не имеет спецификации, вам нужно угадать, в каком формате вы не можете быть уверены.Если средство просмотра текста отображает содержимое как «123», то оно сохраняется как
0x31 0x32 0x33 //in UTF8 (same for ASCII characters)
0x31 0x00 0x32 0x00 0x33 0x00 //in UTF16
0x00 0x31 0x00 0x32 0x00 0x33 //in UTF16 big-endian
Обратите внимание, что UTF16-LE имеет нули для четных байтов в символах ASCII, UTF16-LE имеет нули для нечетных байтов, иUTF8 не имеет нулей.Вы можете начать со слабого предположения, что файл содержит только символы ASCII.Затем сделайте предположение о кодировке.См. Пример ниже.
Чтобы упростить задачу, вы должны использовать UTF8 для хранения текста.В Windows просто конвертируйте UTF16 в UTF8 и сохраняйте его, затем читайте UTF8 и конвертируйте в UTF16.Это будет совместимо и с другими системами.
const int FORMAT_UTF8 = 0;
const int FORMAT_UTF16 = 1;
const int FORMAT_UTF16BE = 2;
int get_file_encoding(const char* filename)
{
printf("filename: %s ", filename);
unsigned char buf[100] = { 0 };
std::ifstream fin(filename, std::ios::binary);
fin.read((char*)buf, sizeof(buf));
int size = fin.gcount();
//check for BOM
if(size >= 3 && memcmp(buf, "\xef\xbb\xbf", 3) == 0)
{
printf("UTF8\n");
return FORMAT_UTF8;
}
if(size >= 2 && memcmp(buf, "\xff\xfe", 2) == 0)
{
printf("UTF16\n");
return FORMAT_UTF16;
}
if(size >= 2 && memcmp(buf, "\xfe\xff", 2) == 0)
{
printf("UTF16 big endian\n");
return FORMAT_UTF16BE;
}
//BOM not found, let's take a guess!
for(int i = 0; i < size - 1; i += 2)
{
if(buf[i + 1] == 0)
{
printf("assume UTF16\n");
return FORMAT_UTF16;
}
if(buf[i] == 0)
{
printf("assume UTF16 big endian\n");
return FORMAT_UTF16BE;
}
}
printf("Assume ASCII or UTF8\n");
return FORMAT_UTF8;
}