Предполагая, что проблема действительно в том, что вы описываете, а не просто недоразумение.
Я боролся с этим.Это не красиво.Это анализирует строку и использует 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 + '"') }