Для поиска по кодовым точкам 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; если так, то час, который я потратил, набрав это, стоил того.