Я хотел бы удалить все недопустимые символы UTF-8 из строки в JavaScript. Я пробовал с этим JavaScript:
strTest = strTest.replace(/([\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})|./g, "$1");
Кажется, что описанное здесь регулярное выражение UTF-8 (ссылка удалена) более полная, и я адаптировал его так же, как:
strTest = strTest.replace(/([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})|./g, "$1");
Оба этих фрагмента кода, по-видимому, позволяют использовать допустимый UTF-8, но не фильтруют практически любые из символов UTF-8 из моих тестовых данных: Возможности декодера UTF-8 и стресс-тест. Либо дурные символы проходят без изменений, либо, похоже, удаляются некоторые из их байтов, создавая новый, недопустимый символ.
Я не очень хорошо знаком с стандартом UTF-8 или с многобайтом в JavaScript, поэтому я не уверен, что я не могу представить правильный UTF-8 в регулярном выражении или если я неправильно применяю это регулярное выражение в JavaScript.
Изменить: добавлен глобальный флаг в мое регулярное выражение за комментарий Tomalak - однако это все еще не работает для меня. Я отказываюсь от этого делать на стороне клиента на комментарий bobince.