Чтобы разделить std::string
на символы, я могу просто перебрать строку.Тем не менее, это не работает, если строка содержит немецкие умлауты ä,ö,ü,ß,...
.
Я нашел решение, используя std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>
, который работает для меня.Но это кажется слишком сложным, есть ли более приятное решение?
#include <string>
#include <vector>
#include <iostream>
#include <locale>
#include <codecvt>
// Works with umlauts:
std::vector<std::string> split_wstring(const std::string &word) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wword = converter.from_bytes(word);
std::vector<std::string> characters;
for (auto iter : wword) {
characters.push_back(converter.to_bytes(iter));
}
return characters;
}
// Works fine for english words but fails for umlauts:
std::vector<std::string> split_string(const std::string &word) {
std::vector<std::string> characters;
for (auto iter : word) {
characters.push_back(&iter);
}
return characters;
}
int main() {
for (auto c : split_string("AbcühßtÖ")) {
std::cout << "Split String: " << c << std::endl;
}
for (auto c : split_wstring("AbcühßtÖ")) {
std::cout << "Split W-String: " << c << std::endl;
}
}
(я разбил слова на std :: strings длины 1 вместо символов, потому что в любом случае мне нужно, чтобы они были std :: strings)
Вывод:
Split String: A
Split String: b
Split String: c
Split String: �
Split String: �
Split String: h
Split String: �
Split String: �
Split String: t
Split String: �
Split String: �
Split W-String: A
Split W-String: b
Split W-String: c
Split W-String: ü
Split W-String: h
Split W-String: ß
Split W-String: t
Split W-String: Ö
Похожий пост: C ++ итерация строки utf-8 со смешанной длиной символов Решение заключается в использовании длинного кода третьей стороны,Я думаю, что мое решение с конвертером wstring уже лучше.