Как сопоставить не-Unicode строку с регулярным выражением в Ruby? - PullRequest
1 голос
/ 12 февраля 2020

Я хочу сопоставить строку, содержащую \xa0, например:

"\xa0" =~ /\xa0/

Но ошибка выдаст:

SyntaxError: (eval):2: invalid multibyte escape: /\xa0/

Я пытаюсь использовать Юникод для сопоставления:

"\xa0" =~ /\u00a0/

тоже сгенерирует ошибку:

ArgumentError: invalid byte sequence in UTF-8

Итак, как сопоставить \ xa0 в ruby

1 Ответ

3 голосов
/ 12 февраля 2020

Не каждая байтовая последовательность является допустимой строкой Юникода. (или, точнее, UTF-8)

Например, ваша однобайтовая строка не является:

str = "\xa0"

str.encoding        #=> #<Encoding:UTF-8>
str.valid_encoding? #=> false
str.codepoints      #   ArgumentError (invalid byte sequence in UTF-8)

Для работы с произвольной строкой вы установили ее кодировку двоичный / ASCII:

str = "\xa0".b      # <-- note the .b

str.encoding        #=> #<Encoding:ASCII-8BIT>
str.valid_encoding? #=> true
str.codepoints      #=> [160]

, а также установить кодирование регулярного выражения в ASCII: (через модификатор n)

str =~ /\xa0/n
#=> 0
...