utf 8 — проверка допустимости строки UTF-8 в современном переполнении стека

Известно, что стандартная библиотека C ++ 11 позволяет легко конвертировать строку из кодировки UTF-8 в UTF-16.
Однако следующий код успешно преобразует недопустимый вход UTF-8 (по крайней мере, в MSVC2010):

#include <codecvt>
#include <locale>
#include <string>

int main() {
std::string input = "\xEA\x8E\x97" "\xE0\xA8\x81" "\xED\xAE\x8D";
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
try {
std::u16string output = converter.from_bytes(input.data());
printf("Converted successfully\n");
}
catch(std::exception &e) {
printf("Error: %s\n", e.what());
}
}

Строка здесь содержит 9 байтов, 3 кода. Последняя кодовая точка — 0xDB8D, что недопустимо (вписывается в диапазон суррогатов).

Можно ли проверить строку UTF-8 на безупречность, используя только стандартную библиотеку современного C ++?
Здесь я имею в виду, что все недействительные случаи, как описано в статья в википедии не допускаются

5

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]