2012-05-13 3 views
0

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

В принципе, если в строке есть \302\240 или аналогичная комбинация, я хочу заменить ее на реальный символ.

Я использую PLruby для этого, следовательно предупреждение.

obj = {"a"=>"some string with special chars"} 
warn obj.inspect 
NOTICE: {"Outputs"=>["a\302\240b"]} <- chars are escaped 
warn "\302\240" 
NOTICE: <-- there is a non breaking space here, like I want 
warn "#{json.inspect}" 
NOTICE: {"Outputs"=>["a\302\240"b]} <- chars are escaped 

Таким образом, они могут быть расшифрованы при использовании строкового литерала, но с «{х} #» форматировать в \ ххх заполнителей никогда не декодируется в символы.

Как бы присвоить ту же строку, что и средняя команда?

Рубин Версия: 1.8.5

+0

Не знаю, что вы имеете в виду, извините ... Возможно, вам стоит перефразировать вопрос. Особенно код и вывод кажутся мне очень странными. –

+0

Я просто хочу использовать .inspect без смешного ускользания. – Keyo

+0

Цель проверки по встроенным типам - предоставить вам представление объекта, который может использоваться как литерал. Это не «смешно». Кажется, вы ищете нечто совершенно другое, может быть, решение было бы хорошей идеей. –

ответ

2

Вы упомянули, что используете PL/ruby. Это говорит о том, что ваши строки на самом деле являются значениями bytea (версия PostgreSQL BLOB) с использованием old "escape" format. Формат побега кодирует значения не-ASCII в восьмеричном с ведущим \ так немного gsub и Array#pack разбирайтесь вас:

bytes = s.gsub(/\\([0-8]{3})/) { [ $1.to_i(8) ].pack('C') } 

Это расширит значение убегания в s сырьевых байт и оставить их в bytes. Вы по-прежнему имеете дело с двоичными данными, хотя просто попытка отобразить его на консоли не обязательно сделает что-нибудь полезное. Если вы знаете, что имеете дело с понятными строками, вам нужно выяснить, в какой кодировке они используются, и использовать Iconv для сортировки кодировки.

+0

Только то, что я искал. Поскольку формат escape был хорош для postgres, но PLruby ускользает от обратных косых черт, из-за чего в таблицах хранится куча \ xxx. Благодарю. – Keyo

+0

@Keyo: существуют функции PostgreSQL для работы с форматами 'bytea': http://www.postgresql.org/docs/current/interactive/functions-binarystring.html#FUNCTIONS-BINARYSTRING -OTHER –

1

Может быть, вы просто хотите использовать .to_s вместо этого?

+0

Мне особенно нужен вывод {"a" => "b"} json, который проверяет возврат. to_s использует нечто совершенно другое. Я просто ищу способ заменить вхождения \ xxx на фактический символ (unescape it). – Keyo

+0

Не имеет смысла просто конвертировать его в json вместо того, чтобы пытаться проверить некоторые значения, а затем gsubbing из проверенной версии? Попробуйте 'require 'json'; json = {"Выходы" => ["a \ 302 \ 240b"]}. to_json; puts json' –

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