Сравнение одной и той же строки в Ruby с той же кодировкой utf-8 завершается ошибкой

#ruby

Вопрос:

Строка с одной стороны была получена в результате очистки сервера, поэтому они могут отличаться, но выглядят одинаково:

 irb(main):013:0> "‎italy" == "italy"
=> false
 

Я проверил кодировку, и она такая же

 irb(main):014:0> "‎italy".encoding === "italy".encoding
=> true

irb(main):016:0> "‎italy".encoding
=> #<Encoding:UTF-8>
 

Почему они разные (==) ?

Ответ №1:

Первая строка содержит МЕТКУ СЛЕВА НАПРАВО в начале. Это не видно при печати строки, но это означает, что строки разные. Сравните результат вызова bytes или chars по строкам.

Вам нужно будет снять его перед обработкой строки.

Комментарии:

1. Как вы его нашли? Какую функцию ruby или js я должен использовать, чтобы сделать их равными? Рассмотрим в качестве ссылки строку, написанную в консоли ruby.

2. @sparkle Я просто скопировал и вставил строки из вашего вопроса в консоль, назначив их переменным, затем вы можете исследовать. например , если вы скопируете первую строку в a = "‎italy" , то a.chars отобразится дополнительный символ как "" и a.codepoints будет отображаться кодовая точка.

3. хорошо, спасибо. Как я могу удалить этот дополнительный символ в ruby?

4. "‎italy".encode!("ASCII", invalid: :replace, undef: :replace, replace: '')

5. Без «!» это тоже работает с нулем. В противном случае я получаю «не могу изменить замороженную строку: «»» ноль.to_s.кодировать! («ASCII», неверно: :заменить, не определено: :заменить, заменить: «)