Не экранированный символ без ASCII в сценарии без ASCII-8BIT
У меня есть это регулярное выражение:
/\「(?>[^\「\」\\]+|\\{2}|\\.)*\」/
(с # -*- encoding : utf-8 -*-
в моем файле), который работает без ошибок в моем приложении. Когда я использую brakeman
гем, чтобы проверить мое приложение, он возвращает следующее:
WARNING: invalid multibyte character: /\「(?>[^\「\」\\]+|\\{2}|\\.)*\」/ for "\\「(?>[^\\「\\」\\\\]+|\\\\{2}|\\\\.)*\\」" ""
+Errors+
+------------------------------------------------------------------------------------------------------>>
| Error >>
+------------------------------------------------------------------------------------------------------->>
| /.../n has a non escaped non ASCII character in non ASCII-8BIT script: /\「(?>[^\「\」\\]+|\\{2}|\\.)*\」/>>
+------------------------------------------------------------------------------------------------------->>
1) Почему отображается предупреждение? (Разве это не символ пробела?)
2) случится ли что-нибудь плохое, если я проигнорирую предупреждение?
3) Есть ли возможность изменить мой код, чтобы он достиг той же цели, но не имел этой проблемы?
1 ответ
Я ничего не знаю о brakeman
, Но так как ваш файл закодирован в UTF-8, поток байтов вашего регулярного выражения читается в ASCII/ANSI с кодовой страницей Windows-1252.
/\「(?>[^\「\ã€\\]+|\\{2}|\\. )*\ã€/
который с шестнадцатеричными значениями
2F 5C E3 80 8C 28 3F 3E 5B 5E 5C E3 80 8C 5C E3 80 8D 5C 5C 5D 2B 7C 5C 5C 7B 32 7D 7C 5C 5C 2E 29 2A 5C E3 80 8D 2F
Как вы можете видеть, существует много "символов" (байтов) со значением кода больше 127 десятичных (шестнадцатеричное 7F) без обратной косой черты, если поток байтов не преобразуется сначала из UTF-8 в Unicode (обычно UTF-16 Little Endian),
Регулярные выражения Perl можно писать всегда без каких-либо символов со значением кода больше 127, даже если выражение должно находить символы в полном диапазоне Юникода.
На форуме сценариев текстового редактора UltraEdit есть тема Создание строки регулярного выражения Perl с символами ANSI/Unicode, которая объясняет, как такое выражение может быть создано, и дополнительно содержит ссылку на скрипт UltraEdit, который использует в основном код JavaScript для преобразования регулярного выражения. с символами ANSI или Unicode внутри выражения с использованием их шестнадцатеричных представлений и, следовательно, только символов ASCII.
Использование этого скрипта UltraEdit в UltraEdit для вашего регулярного выражения после удаления ненужных обратных слешей перед тем, как символы Unicode помещают в буфер обмена строку регулярного выражения Perl
/\x{300c}(?>[^\x{300c}\x{300d}\\]+|\\{2}|\\.)*\x{300d}/
Для скрипта на Ruby \u
должен быть использован вместо \x
в результате получается выражение:
/\u{300c}(?>[^\u{300c}\u{300d}\\]+|\\{2}|\\.)*\u{300d}/
И эта строка регулярного выражения должна найти то же самое, что и ваша строка, без предупреждения brakeman
поскольку теперь он состоит только из символов ASCII со значением кода меньше десятичного.