Удалить символы Юникода в различных диапазонах в JavaScript
Я пытаюсь удалить каждый символ Unicode в строке, если он попадает в любой диапазон ниже.
\uD800-\uDFFF
\u1D800-\u1DFFF
\u2D800-\u2DFFF
\u3D800-\u3DFFF
\u4D800-\u4DFFF
\u5D800-\u5DFFF
\u6D800-\u6DFFF
\u7D800-\u7DFFF
\u8D800-\u8DFFF
\u9D800-\u9DFFF
\uAD800-\uADFFF
\uBD800-\uBDFFF
\uCD800-\uCDFFF
\uDD800-\uDDFFF
\uED800-\uEDFFF
\uFD800-\uFDFFF
\u10D800-\u10DFFF
В качестве исходного прототипа я попытался просто удалить символы в первом диапазоне, используя регулярное выражение в replace
функция.
var buffer = "he\udfffllo world";
var output = buffer.replace(/[\ud800-\udfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
В этом случае персонаж, кажется, был заменен в порядке.
Однако, когда я заменяю это на
var buffer = "he\udfffllo worl\u1dfffd";
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
Я вижу что-то неожиданное. Мой вывод отображается как:
he llo worl᷿fd заменяется на
Здесь следует отметить две вещи:
\u1dfff
не отображается как один символ -\u1dff
превращается в персонажа иf
в конце концов, это рассматривается как его собственный характер- Результатом является пустая строка.
Любые предложения о том, как я могу это сделать, будут высоко оценены.
РЕДАКТИРОВАТЬ
Моя общая цель - отфильтровать всех персонажей, которые encodeURIComponent
функция считает недействительным. Я запустил несколько тестов и обнаружил, что приведенный выше список является недействительным набором символов. Например, код ниже, который сначала преобразует 1dfff
на символ Unicode, прежде чем передать это encodeURIComponent
вызывает исключение, которое будет вызвано последней функцией.
var v = String.fromCharCode(122879);
var uriComponent = encodeURIComponent(v);
Я отредактировал части вопроса после того, как @Blender указал, что я использую x
вместо u
в моем коде для представления символов Unicode.
РЕДАКТИРОВАТЬ 2
Я исследовал мою технику для получения "недопустимых" диапазонов Юникода дальше, и, как оказалось, если вы дадите String.fromCharacterCode
число, которое больше 16 бит, оно просто посмотрит на младшие 16 бит числа. Это объясняет шаблон, который я видел. Так что, как оказалось, мне нужно беспокоиться только о первом диапазоне.
1 ответ
Кажется, вы пытаетесь удалить суррогатные единицы кода Unicode из строки. Однако только U+D800 - U+DFFF являются суррогатными кодовыми точками; остальные значения, которые вы называете, не являются и могут быть назначены действительным символам Unicode. В этом случае будет достаточно следующего (используйте \u
скорее, чем \x
для ссылки на символы Юникода):
buffer.replace(/[\ud800-\udfff]/g, "");