Rails 3.2.21 / ruby ​​1.9.3 как я могу кодировать символы Юникода в строке

Мне нужно очистить некоторый текст, отправленный поставщику услуг электронной почты (Sendgrid), который не поддерживает юникод в имени получателя, если он не экранирован.

Когда строка UTF-8 s = "Pablö" как я могу "\ избежать" любой Unicode внутри строки, чтобы я получил "Pabl\u00f6"?

Преобразование в JSON также экранирует кавычки (которые я не хочу):

"Pablö".to_json
=> "\"Pabl\\u00f6\""

Я ищу что-то вроде.force_encoding('binary'), за исключением Unicode. инспектирование Encoding.aliases.values.uniq Я не вижу ничего похожего на "Юникод".

1 ответ

Решение

Я собираюсь предположить, что все это UTF-8, потому что мы не пещерные люди, стучащие по камням вместе.

to_json не экранирует кавычки, это добавляет кавычки внутри строки (потому что JSON требует, чтобы строки были заключены в кавычки), а затем inspect избегает их (и обратной косой черты).

Эти цитаты из to_json всегда должен быть там, чтобы вы могли просто снять их:

"Pablö".to_json[1..-2] # Lots of ways to do this...
=> "Pabl\\u00f6"

Имейте в виду, однако, что поведение to_json и UTF-8 зависит от того, какую библиотеку JSON вы используете, и, возможно, от других вещей. Например, в моем стандартном Ruby 2.2 стандартная библиотека JSON оставляет UTF-8 в покое; спецификация JSON вполне устраивает UTF-8, так зачем его кодировать? Таким образом, вы можете сделать это самостоятельно с чем-то вроде:

s.chars.map { |c| c.ord > 127 ? '\u%.4x' % c.ord : c }.join

Все, что выше 127, находится вне диапазона ASCII, так что просто ord тест заботится о чем-либо вроде ö, ñ, µ... Вы хотите настроить map блок, если вам нужно кодировать другие символы (например, \n).

Другие вопросы по тегам