2013-06-02 2 views
5

Я пытаюсь удалить каждый символ Юникода в строке, если он попадает в любые диапазоны ниже.Удалить символы Юникода в разных диапазонах в javascript

\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; 

я вижу что-то неожиданное. Мой выход показывает, как:

привет worl᷿fd заменяется

Есть две вещи, чтобы отметить здесь:

  1. \u1dfff не показывается как один символ - \u1dff получает преобразуется в символ и f в конце обрабатывается как его собственный символ
  2. результат пустой строки.

Любые предложения о том, как я могу это сделать, будут высоко оценены.


EDIT

Моя общая цель состоит в том, чтобы отфильтровать все символы, которые функция encodeURIComponent считает недействительным. Я провел несколько тестов и нашел приведенный выше список как набор символов, которые являются недопустимыми. Например, приведенный ниже код, который сначала преобразует 1dfff в символ Юникода, прежде чем передать его на encodeURIComponent, вызывает исключение последней функции.

var v = String.fromCharCode(122879); 
var uriComponent = encodeURIComponent(v); 

я редактировал части вопроса после того, как @Blender указал, что я использовал x вместо u в моем коде для представления символов Unicode.


EDIT 2

Я исследовал мою технику для извлечения «Неверные» юникод диапазоны дальше, и, как выясняется, если вы даете String.fromCharacterCode число, которое больше, чем 16 бит, это будет просто посмотрите на самые младшие 16 бит номера. Это объясняет модель, которую я видел. Так что, как оказалось, мне нужно только беспокоиться о первом диапазоне.

+0

'\ xdfff' интерпретируется как' \ xdf', '' f' и f'. – Blender

+0

Ах, ты прав, это объясняет, почему я видел странные результаты во второй попытке. Теперь измените эту часть вопроса. –

+0

Обозначение '\ u1D800' и ​​большинство других обозначений недействительны вообще (или, технически,' \ u1D800', означает U + 1D80, за которым следует цифра 0. Пожалуйста, сформулируйте свой вопрос в терминах символов Unicode, не используя предполагаемые (и недействительные) escape-уведомления для них. –

ответ

4

Кажется, вы пытаетесь удалить юникодные суррогатные единицы кода из строки. Однако только U + D800 через U + DFFF являются суррогатными кодовыми точками; остальные значения, которые вы называете, отсутствуют, и могут быть назначены действительным символам Юникода.В этом случае следующее будет достаточно (использовать \u, а не \x для обозначения символов Unicode):

buffer.replace(/[\ud800-\udfff]/g, ""); 
+0

Спасибо за ответ Peter Я отредактировал t он задает вопрос о более подробных сведениях о том, как я придумал список символов, которые нужно удалить. После того, как я заменил \ x на \ u, я прекратил получать синтаксическую ошибку, но заметил некоторые другие интересные действия, которые я изложил в редактировании. Еще раз спасибо за то, что посмотрели. –

+0

Вникните в это дальше, и, как оказалось, вы правы в том, что мне нужно только беспокоиться о первом диапазоне. Я добавил объяснение во второе редактирование, которое я сделал для этого вопроса. –