5

Как мне найти этот символ (при поиске юникода) в блокноте ++ ﻁ

Если я пойду к charmap

и я выбираю этого персонажа

Я набираю FEC1 в поле поиска Unicode и нажимаю ENTER, и он находит символ

Я смотрю это на fileformat.info

http://www.fileformat.info/info/unicode/char/fec1/index.htm

UTF-8 (hex)   0xEF 0xBB 0x81 (efbb81)
UTF-16 (hex)  0xFEC1 (fec1)

Если я ввожу символ в поле поиска буквально, он находит его

Но я не вижу, какой юникод искать, чтобы найти его

Я хотел бы иметь возможность искать его как в UTF-8, так и в UTF-16

[\uFEC1], кажется, находит символ, но он находит больше, чем этот символ

Теперь, если я добавлю туда несколько FEC9, то я вижу, что [\uFEC1], кажется, тоже их находит

Итак, как мне искать \uFEC1 и только это. И мне интересно искать его по коду UTF-8 тоже

2 ответа2

11

Для поиска по кодовым точкам Unicode с использованием UTF-16 вы должны использовать (\x{FEC1}), и он работает независимо от того, закодирован ли файл в UTF-8 или UTF-16.

Имейте в виду, что вам не нужно искать по коду UTF-8, потому что вы можете искать по коду UTF-16. Но чтобы ответить на ту часть вашего вопроса, которая спрашивает, как вы ищите этот символ по коду UTF-8 ...

Ты не можешь Ну, ты вроде как можешь, но это отвратительный взлом, и ты действительно не должен.

Очевидная вещь, которую стоит попробовать, это поиск \xef\xbb\x81 в вашем кодированном документе UTF-8, но это не работает. (Обратите внимание, что здесь нет {} : Notepad++ ожидает либо \xNN для 2 шестнадцатеричных цифр, либо \x{NNNN} для 4 шестнадцатеричных цифр). Это потому, что Notepad++ на самом деле не ищет байтовые значения, он ищет кодовые точки Unicode. Таким образом, вы можете искать кодовую точку U+ FEC1, но не байты UTF-8 0xEF 0xBB 0x81, потому что Notepad++ "скрывает" от вас детали кодирования. (Потому что почти в каждом сценарии редактору текстового файла гораздо важнее найти реальный символ, чем найти байты UTF-8.)

Есть еще один прием, который вы можете попробовать: взять этот кодированный в UTF-8 файл и выбрать пункт меню « Encoding → Encode in ANSI , и в этот момент ﻁﻁﻉﻁﻉﻁﻉ становится « ï»ï»ï»‰ï»ï»‰ï»ï»‰ . (Я говорю «кажется, становится», а не "становится", потому что ... ну, читайте дальше.) Это потому, что он взял текст UTF-8 вашего файла и переосмыслил его как "ANSI" (это ужасное название кодировки, потому что оно совершенно неверно и должно действительно называться «Windows-1252» , но это другой вопрос ). (Кстати, причина того, что ﻁﻁﻉﻁﻉﻁﻉ смотрит в моем тексте назад, чем на скриншоте: это потому, что Notepad++ не заботится о том, что арабский язык пишется справа налево, поэтому он показывает символы слева направо в том порядке, в котором они были вставлены в файл. Но ваш браузер заботится о представлении Arabic в надлежащем порядке справа налево, первые две буквы из этой строки ﻁﻁ появляются на правой стороне строки, а не на левой стороне , как они , кажется, в Notepad++). Отступите в сторону, вот почему это будет полезно. В кодировке "ANSI" (в действительности Windows-1252) каждый байт представляет собой один символ, и теперь вы сможете выполнять поиск по отдельным байтам. Теперь, если вы ищете \xef\xbb\x81 (который не должен быть регулярным выражением, просто "расширенный" поиск), он найдет символы. Вроде, как бы, что-то вроде. Он будет выглядеть так, как будто он выделяет два символа ï» , но он действительно выделяет три символа: ï , » и "невидимый" символ 0x81 , которого на самом деле не существует. (Поскольку в кодировке Windows-1252 нет символа в точке 0x81 : убедитесь сами .) И теперь вы понимаете, почему я сказал «кажется, становится» - потому что ваш кодированный в UTF-8 текст действительно стал « ï»_ï»_ﻉï»_ﻉï»_ﻉ , где _ представляет" невидимый "символ это официально не существует в кодовой странице Windows-1252. В любом случае, теперь, когда вы нашли последовательность из трех символов со значениями байтов 0xEF, 0xBB и 0x81 в Windows-1252, и Notepad++ выделил их, вы можете выбрать пункт меню Encoding → Encode in UTF-8 и ваш текст преобразуется обратно в UTF-8, в то время как Notepad++ будет сохранять выделение в том же месте - и, таким образом, вы обнаружите, что выделен один символ .

Так почему я говорю, что ты действительно не должен этого делать? Потому что единственная причина, по которой он работает, заключается в том, что Notepad++ не правильно сделал, когда вы переключали кодовые страницы. Правильнее всего, когда вы найдете отсутствующий символ, это пожаловаться или вставить символ, такой как символ замены Юникода (или простой ? если вы находитесь на устаревшей кодовой странице, в которой нет ), или сделайте что-нибудь, чтобы пользователь узнал, что в его тексте есть недопустимый символ. Ошибки никогда не следует игнорировать, и наличие значения 0x81 в тексте Windows-1252 является ошибкой. Единственная причина, по которой этот трюк работает, заключается в том, что Notepad++ делает неправильные действия с недопустимыми символами (то есть игнорирует их). Так что вам не стоит полагаться на этот трюк: при любом обновлении Notepad++ он может изменить свое недокументированное (и неправильное) поведение и начать помещать правильные заменяющие символы в неправильно закодированный текст, после чего этот трюк потерпит неудачу. Придерживайтесь поиска реальных кодовых точек Unicode, и вам станет намного лучше.

Кстати, причина, по которой ваша первоначальная попытка ([\uFEC1]) не удалась, заключается в том, что, согласно синтаксису регулярных выражений Notepad++, \u означает "заглавная буква". (Помните, что в регулярных выражениях скобки представляют "любой из этих символов"). Далее в документах говорится:«См. Примечание о строчных [sic] буквах», а в примечании о строчных буквах - «это будет означать" символ слова ", если опция поиска" Соответствовать регистру "отключена». Как это на вашем скриншоте. Поэтому регулярное выражение [\uFEC1] ищет «любой символ слова, или F, или E, или C, или 1», который соответствует каждому отдельному символу в вашем тексте образца.

Уф, это оказалось очень длинным ответом на то, что я сказал, будет "очень просто". Я надеюсь, что это поможет вам лучше понять Unicode; если так, то час, который я потратил, набрав это, стоил того.

4

Взгляните: кто-нибудь знает, как использовать Regex в notepad++ для поиска арабских символов?

Поскольку для реализации Регулярных выражений в Notepad++ требуется использовать

\x{NNNN}

нотация для соответствия символов Unicode.

В вашем примере

\x{FEC1} 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .