Проверьте, все ли символы в строке UTF16 являются действительными? - PullRequest
1 голос
/ 10 февраля 2012

У меня проблема с тем, что у меня есть строки UTF16 (std::wstring), которые могут содержать «недопустимые» символы, из-за чего мой консольный терминал перестает печатать (см. вопрос ).

Интересно, есть ли быстрый способ проверить все символы в строке и заменить любые недопустимые символы на ?.

Я знаю, что мог бы сделать что-то в этом духе с помощью регулярного выражения, но было бы трудно заставить его проверять все действительные символы, а также медленно. Есть ли, например, числовой диапазон для кодов символов, которые я мог бы использовать, например, все коды символов между 26-5466 действительны?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Должно быть возможно использовать std::ctype<wchar_t>, чтобы определить, можно ли печатать символ:

std::local loc;
std::replace_if(string.begin(), string.end(),
                [&](wchar_t c)->bool { return !std::isprint(c, loc); }, L'?');
0 голосов
/ 10 февраля 2012

Я подозреваю, что ваша проблема связана не с действительностью символов, а со способностью консоли печатать их.

Определение, которое UNICODE делает для «печати», не обязательно совпадает с эффективностью самой консоли «печатать».

Символы типа «€» «печатаются», но, например, не на консолях winXP.

...