Я хочу сделать некоторые простые манипуляции с строками в текстовом файле utf8. Это будет означать взятие подстрок из строки и вывод их перегруппировки.C++ string manipulation with the utf8 locale
Как мой Linux-компьютер имеет языковой стандарт utf8, и я не намерен запускать программу в другом месте, поскольку locale to utf8, казалось, был для вас способом. Адаптация примера, который я привел в тестовую программу ниже. Если вы даете ему греческое слово, оно выводит то же самое, но вывод результата substr просто производит мусор. Есть ли еще одна функция, которую я могу использовать или использую локаль utf8 полностью неправильным способом?
#include <string>
#include <iostream>
int main()
{
std::string newwd;
setlocale(LC_ALL, "");
std::cout << "Enter greek word ";
std::string wordgr;
std::getline(std::cin, wordgr);
std::cout << "The word is " << wordgr << "." << std::endl;
newwd=wordgr.substr(2,1) ;
std::cout << "3rd letter is " << wordgr.substr(2,1) << " <" << std::endl;
return 0;
}
UTF-8 - кодирование переменной длины; данный символ в UTF-8 может составлять от одного до шести байтов. Это вызывает метод substr(), который работает с байтами, а не с символами * для получения неожиданных результатов. Греческие символы в UTF-8 не являются однобайтными символами. Если вы введете 4-значную греческую строку, а затем на это слово вызывается 'std :: string.length()', вы получите результат больше 4 байтов (скорее всего, 8 байтов). –
@KenP Вы должны разместить это как ответ. :) – 0x499602D2
Очень простое решение - переключиться на wstring и wiostream и wchar_t. –