Rails обнаруживает иностранные символы? - PullRequest
4 голосов
/ 26 августа 2011

Мне интересно, есть ли способ обнаружить иностранные символы в Rails.

Я прочитал, что Rails по умолчанию не использует Юникод, а иностранные символы, такие как китайский и японский, имеют назначенные диапазоны в Юникоде. Есть ли простой способ обнаружить эти символы в Rails? или просто укажите диапазон ожидаемых символов?

Есть ли плагин для этого? Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 26 августа 2011

Все кодировки идеографического языка используют несколько байтов для представления символа, и Ruby 1.9+ знает о разнице между байтами и символами (Ruby 1.8 не)

Вы можете сравнить длину символа с длиной байта строки как быстрый и грязный детектор. Это, вероятно, не надежно, хотя.

class String
  def multibyte?
    chars.count < bytes.count
  end
end

"可口可樂".multibyte? #=> true
"qwerty".multibyte? #=> false
1 голос
/ 26 августа 2011

Это довольно просто с 1.9.2, так как регулярные выражения основаны на символах в 1.9.2, а 1.9.2 знает разницу между байтами и символами сверху вниз. Вы в Rails, поэтому вы должны получить все в UTF-8. К счастью, UTF-8 и ASCII перекрываются для всего диапазона ASCII, поэтому вы можете просто удалить все, что не находится между ' ' и '~', когда у вас есть кодированный в UTF-8 текст:

>> "Wheré is µ~pancakes ho元use?".gsub(/[^ -~]/, '')
=> "Wher is ~pancakes house?"

Хотя на самом деле нет причин идти на все эти неприятности. Ruby 1.9 прекрасно работает с Unicode, как и Rails и почти все остальное. Работа с текстом, не относящимся к ASCII, была кошмаром 15 лет назад, а теперь это обычное явление.


Если вам удастся получить текстовые данные, отличные от UTF-8, у вас есть несколько вариантов. Если кодировка ASCII-8BIT или BINARY, то вы, вероятно, можете обойтись без s.force_encoding('utf-8'). Если у вас получится что-то отличное от UTF-8 и ASCII-8BIT, вы можете использовать Iconv для перекодирования.

Ссылки

...