2012-02-10 2 views
1

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

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

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

ответ

2

Должна быть возможность использовать 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

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

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

Характер, подобный '€', является «пригодным для печати», но, например, не на консолях winXP.