Ruby строковое представление - PullRequest
1 голос
/ 29 сентября 2011

У меня в базе данных есть строка типа \ 303 \ 255, которая представляет í.

Как я могу преобразовать это представление из 8 символов в í?

Я мог бы заменить их все, но это не так 'Есть ли другой способ?

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Это не совсем 8 символов в строке, это 2 байта. Я не уверен, где вы хотите, чтобы \ 303 \ 255 отображался как í, но если вы поставите

# encoding: utf-8

в верхней части вашего .rb-файла Ruby будет использовать UTF-8.

Если вы используете Ruby on Rails, вы можете попробовать добавить следующие две строки в config / environment.rb

Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8
0 голосов
/ 29 сентября 2011

Предполагая, что проблема действительно в том, что вы описываете, а не просто недоразумение.

Я боролся с этим.Это не красиво.Это анализирует строку и использует pack для упаковки соответствующих байтов.

"foo \\303\\255 bar".gsub(/(\\\d{3})+/) do |match|
  match[1..-1].split("\\").map{ |octet| octet.to_i(8) }.pack("c*")
end.force_encoding("UTF-8")

Гораздо более короткая версия использует eval, но всегда стоит избегать eval, если вы можете, так как этоимеет огромный риск для безопасности при неправильном использовании.Учитывая, что мы проверяем формат того, что мы eval здесь, я продолжу и скажу, что, вероятно, это безопасно сделать:

"foo \\303\\255 bar".gsub(/(\\\d{3})+/) { |m| eval('"' + m + '"') }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...