Удалить символ не-ascii в строке - программирование
Подтвердить что ты не робот

Удалить символ не-ascii в строке

var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";

и мне нужно удалить все символы не-ascii из строки,

означает, что str содержит только "INFO" (Higashikurume) ";

4b9b3361

Ответ 1

ASCII находится в диапазоне от 0 до 127, поэтому:

str.replace(/[^\x00-\x7F]/g, "");

Ответ 2

Вы можете использовать следующее регулярное выражение для замены символов, отличных от ASCII

str = str.replace(/[^A-Za-z 0-9 \.,\?""[email protected]#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

Однако обратите внимание, что пробелы, двоеточия и запятые все допустимы ASCII, поэтому результат будет

> str
"INFO] :, , ,  (Higashikurume)"

Ответ 3

Это также можно сделать с положительным утверждением удаления, например:

textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");

В этом случае используется unicode. В Javascript при выражении юникода для регулярного выражения символы указываются с помощью escape-последовательности \u{xxxx}, но также должен присутствовать флаг 'u'; обратите внимание, что в regex есть флаги 'gu'.

Я назвал это "положительным утверждением удаления" в том смысле, что "положительное" утверждение выражает, какие символы удалять, а "отрицательное" утверждение выражает, какие буквы не удалять. Во многих контекстах негативное утверждение, как указано в предыдущих ответах, может быть более наглядным для читателя. Огибающий "^" говорит "нет", а диапазон \x00-\x7F говорит "ascii", поэтому оба вместе говорят "не ascii".

textContent = textContent.replace(/[^\x00-\x7F]/g,"");

Это отличное решение для говорящих на английском языке, которые интересуются только английским языком, а также прекрасный ответ на оригинальный вопрос. Но в более общем контексте нельзя всегда принимать культурную предвзятость, предполагая, что "все не-ascii - это плохо". Для контекстов, в которых используется не-ascii, но иногда их необходимо удалить, положительное утверждение Unicode лучше подходит.

Хорошая индикация того, что нуль-ширина, непечатаемые символы встроены в строку, когда свойство "длина" строки является положительным (отличным от нуля), но выглядит как (например, печатает как) пустую строку. Например, я обнаружил это в отладчике Chrome, для переменной с именем "textContent":

> textContent
""
> textContent.length
7

Это побудило меня посмотреть, что было в этой строке.

> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"

Эта последовательность байтов, похоже, находится в семействе некоторых символов Unicode, которые вставляются текстовыми процессорами в документы, а затем попадают в поля данных. Чаще всего эти символы встречаются в конце документа. Пустое пространство "%E2%80%8B" может быть вставлено CK-редактором (CKEditor).

encodeURI()  UTF-8     Unicode  html     Meaning
-----------  --------  -------  -------  -------------------
"%E2%80%8B"  EC 80 8B  U 200B   &#8203;  zero-width-space
"%E2%80%8E"  EC 80 8E  U 200E   &#8206;  left-to-right-mark
"%E2%80%8F"  EC 80 8F  U 200F   &#8207;  right-to-left-mark

Некоторые ссылки на них:

http://www.fileformat.info/info/unicode/char/200B/index.htm

https://en.wikipedia.org/wiki/Left-to-right_mark

Обратите внимание, что хотя кодирование встроенного символа является UTF-8, кодирование в регулярном выражении не является. Хотя символ встроен в строку как три байта (в моем случае) UTF-8, инструкции в регулярном выражении должны использовать двухбайтовый Unicode. Фактически UTF-8 может иметь длину до четырех байтов; он менее компактен, чем Unicode, потому что он использует высокий бит (или бит), чтобы избежать стандартного кодирования ascii. Это объясняется здесь:

https://en.wikipedia.org/wiki/UTF-8

Ответ 4

Чтобы использовать ASCII с акцентами:

var str = str.replace(/[^\x00-\xFF]/g, "");

Ответ 5

Быстрый поиск Google возвращает эту статью в StackOverflow:

обрезать не-ascii символы из строки, возвращаемой nodejs crypto

Я не буду отвечать за ответ, однако вы можете заменить символы не-ascii с помощью этого регулярного выражения:

str.replace(/[^A-Za-z 0-9 \.,\?""[email protected]#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '') ;