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
).