Это сложная задача в целом, и вам, вероятно, придется адаптировать свое решение к конкретной задаче. Для транслитерации вашей строки из любой кодировки в ASCII лучше полагаться на библиотеку, а не пытаться реализовать это самостоятельно. Вот пример использования iconv:
#include <iconv.h>
#include <memory>
#include <type_traits>
#include <string>
#include <iostream>
#include <algorithm>
#include <string_view>
#include <cassert>
using namespace std;
string from_u8string(const u8string &s) {
return string(s.begin(), s.end());
}
using iconv_handle = unique_ptr<remove_pointer<iconv_t>::type, decltype(&iconv_close)>;
iconv_handle make_converter(string_view to, string_view from) {
auto raw_converter = iconv_open(to.data(), from.data());
if (raw_converter != (iconv_t)-1) {
return { raw_converter, iconv_close };
} else {
throw std::system_error(errno, std::system_category());
}
}
string convert_to_ascii(string input, string_view encoding) {
iconv_handle converter = make_converter("ASCII//TRANSLIT", encoding);
char* input_data = input.data();
size_t input_size = input.size();
string output;
output.resize(input_size * 2);
char* converted = output.data();
size_t converted_size = output.size();
auto chars_converted = iconv(converter.get(), &input_data, &input_size, &converted, &converted_size);
if (chars_converted != (size_t)(-1)) {
return output;
} else {
throw std::system_error(errno, std::system_category());
}
}
string convert_to_plain_ascii(string_view input, string_view encoding) {
auto converted = convert_to_ascii(string{ input }, encoding);
converted.erase(
std::remove_if(converted.begin(), converted.end(), [](char c) { return !isalpha(c); }),
converted.end()
);
return converted;
}
int main() {
try {
auto converted_utf8 = convert_to_plain_ascii(from_u8string(u8"Frédérik"), "UTF-8");
assert(converted_utf8 == "Frederik");
auto converted_1252 = convert_to_plain_ascii("Frédérik", "windows-1252");
assert(converted_1252 == "Frederik");
} catch (std::system_error& e) {
cout << "Error " << e.code() << ": " << e.what() << endl;
}
}