2012-06-11 3 views
1

У меня есть этот хэш:Почему xF3 не распознается как UTF-8

a={"topic_id"=>60693, "urlkey"=>"innovacion", "name"=>"Innovaci\xF3n"} 

и я пытаюсь сохранить его в MongoDB используя Mongoid, когда я получаю эту ошибку:

BSON::InvalidStringEncoding: String not valid UTF-8 

Я затем пытается gsub его:

a["name"].gsub(/\xF3/,"o") 

и я получаю: SyntaxError: (pry):12: too short escaped multibyte character: /\xF3/

Я добавил волшебный комментарий в начале моей модели файла: # encoding: UTF-8

ответ

4

Hexidecimal 0xF3 сам по себе является не действует UTF-8. Значения, превышающие 0x7F, являются многобайтовыми символами. Что заставляет вас думать, что это должен быть UTF-8?

Вы можете прочитать о допустимых последовательностях здесь: http://en.wikipedia.org/wiki/UTF-8#Description

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

str.force_encoding("BINARY") 

С двоичной кодировкой #gsub и другими строковыми операциями, которые полагаются на действительные кодировки, будут работать побайтно, а не посимвольно.

+0

Я думаю, что mongo/bson все равно отклонит недействительный utf8, хотя –

+0

Как полагает @FrederickCheung, он действительно отклонен монго. Однако я придумал это: '' 'a.force_encoding (" BINARY "). Gsub (0xF3.chr," ")' '', который отлично работает. Тем не менее, я не могу найти способ выразить его с помощью Regexp, так как я не могу использовать метод после выражения: '' 'a.force_encoding (« BINARY »). Gsub (/ 0x ....? /. Chr, "") '' 'вызывает ошибку:' '' NoMethodError: undefined method 'chr 'для/0x ....? /: Regexp''' – Cacofonix

+0

Для записи мне удалось преодолеть проблему недопустимого UTF -8 char '' 'unpack (" C * "). Pack (" U * ")' '' строка, о которой идет речь ... – Cacofonix

Смежные вопросы