Преобразовать экранированную строку Юникода в ее символы в ruby ​​1.8 - PullRequest
6 голосов
/ 29 октября 2010

Мне нужно прочесть некоторые текстовые файлы со следующим содержимым:

\ u201C The Pedlar Lady of Gushing Cross \ u201D

В терминале ruby ​​1.9, когда я создаю строку с таким содержанием:

ruby-1.9.1-p378 > "\u2714 \u2714 my great string \u2714 \u2714"
 => "✔ ✔ my great string ✔ ✔" 

В ruby ​​1.8 я не конвертирую юникод-коды в их символы:

ree-1.8.7-2010.01 > "\u2714 \u2714 my great string \u2714 \u2714"
 => "u2714 u2714 my great string u2714 u2714" 

Есть ли какой-нибудь простой способ вернуть правильные строковые символы в Ruby 1.8?

Ответы [ 3 ]

6 голосов
/ 04 апреля 2012

Для тех, кто ищет ответ на этот вопрос (например, я), эквивалентный способ сделать это в Ruby 1.8 будет:

["2714".to_i(16)].pack("U*")
5 голосов
/ 30 октября 2010

Самым простым подходом может быть использование парсера JSON, поскольку JSON использует именно этот формат:

irb(main):014:0> JSON '["\u2714 \u2714 my great string \u2714 \u2714"]'
=> ["\342\234\224 \342\234\224 my great string \342\234\224 \342\234\224"]
1 голос
/ 21 мая 2014

Это основано на ответе @ Дейва.Я использую следующее для замены всех escape-последовательностей Unicode в данной строке соответствующим символом:

string_value.gsub(/\\u([0-9a-fA-F]{4})/) {|m| [$1.hex].pack("U")}

Это регулярное выражение, которое ищет «\ u», за которым следуют 4 шестнадцатеричных символа.Затем он выбрасывает «\ u», преобразует 4 шестнадцатеричных символа в целое число и использует пакет, чтобы получить символ Unicode.Он заменяет каждую escape-последовательность соответствующим символом и возвращает результирующую строку.

Это создаст вам проблемы, если ваша строка будет экранирована (например, из-за того, что "\" экранирован как "\\").Но в случае с ванилью все должно работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...