Если у вас есть 8-битный ввод ascii, то вы можете просто выбросить любой код символа> 127.
Если у вас есть какой-то хитрый UTF-8, его довольно легко разобрать, но номер символа в широком символе, который выГенерирование может быть вне диапазона Юникода.Вы можете использовать mbrlen()
для индивидуальной проверки каждого символа.
Я описываю это, используя символы без знака.Если вы должны использовать знаковые символы, то> 128 означает <0. </p>
В самом простом виде:
Until the null byte
1 If the next byte is 0, then end the loop
2 If the next byte is < 128 then it is ascii, so keep it
3 If the next byte is >=128 < 128+64 it is invalid - discard it
4 If the next byte is >= 128+64 then it is probably a proper UTF-8 lead byte
call size_t mbrlen(const char *s, size_t n, mbstate_t *ps);
to see how many bytes to keep
if mbrlen says the code is bad (either the lead byte or the trail bytes),
skip 1 byte. Rule 3 will skip the rest.
Еще более простая логика просто несколько раз вызывает mbrlen, поскольку она может принять низкий диапазон ascii.
Вы можете предположить, что вся «мебель» файла (например, xml <> / символы, пробелы, кавычки и символы новой строки) не будут изменены этим редактированием, так как все они действительны для 7-битного asciiкоды.