Как мне избежать строки Unicode с Ruby? - PullRequest
11 голосов
/ 06 апреля 2011

Мне нужно закодировать / преобразовать строку Юникода в ее экранированную форму с обратной косой чертой. Кто-нибудь знает как?

Ответы [ 6 ]

22 голосов
/ 06 апреля 2011

В Ruby 1.8.x String # inspect может быть тем, что вы ищете, например,

>> multi_byte_str = "hello\330\271!"
=> "hello\330\271!"

>> multi_byte_str.inspect
=> "\"hello\\330\\271!\""

>> puts multi_byte_str.inspect
"hello\330\271!"
=> nil

В Ruby 1.9, если вы хотите, чтобы многобайтовые символы экранировали свои байты, вы можете сказать что-то вроде:

>> multi_byte_str.bytes.to_a.map(&:chr).join.inspect
=> "\"hello\\xD8\\xB9!\""

В Ruby 1.8 и 1.9, если вы вместо этого заинтересованы в (экранированных) кодовых точках Юникода, вы могли бы сделать это (хотя это также ускользает от печатных материалов):

>> multi_byte_str.unpack('U*').map{ |i| "\\u" + i.to_s(16).rjust(4, '0') }.join
=> "\\u0068\\u0065\\u006c\\u006c\\u006f\\u0639\\u0021"
13 голосов
/ 06 апреля 2011

Чтобы использовать символ юникода в Ruby, используйте escape "\ uXXXX"; где XXXX - кодовая точка UTF-16. см http://leejava.wordpress.com/2009/03/11/unicode-escape-in-ruby/

8 голосов
/ 06 апреля 2011

Если вы пользуетесь Rails, вы можете использовать кодировщик JSON для этого:

require 'active_support'
x = ActiveSupport::JSON.encode('µ')
# x is now "\u00b5"

Обычный не-Rails-кодировщик JSON не "\ u" -сифицирует Unicode.

3 голосов
/ 27 ноября 2013

Вы можете напрямую использовать символы Юникода, если просто добавите #Encoding: UTF-8 в начало файла. Затем вы можете свободно использовать ä, ǹ, ú и т. Д. В исходном коде.

0 голосов
/ 07 апреля 2019

На ваш вопрос, как я понимаю, есть два компонента: поиск числового значения символа и выражение таких значений как escape-последовательности в Ruby. Кроме того, первое зависит от вашей отправной точки.

Нахождение значения:

Метод 1a: из Ruby с String#dump:

Если у вас уже есть символ в объекте Ruby String (или вы можете легко получить его в одном), это может быть так же просто, как отображение строки в repl (в зависимости от определенных настроек в вашей среде Ruby). Если нет, вы можете вызвать метод #dump. Например, в файле с именем unicode.txt, содержащем некоторые данные в кодировке UTF-8, например символы валюты €£¥$ (плюс завершающий перевод строки), выполняется следующий код (выполняется либо в irb, либо как скрипт):

s = File.read("unicode.txt", :encoding => "utf-8") # this may be enough, from irb
puts s.dump # this will definitely do it.

... следует распечатать:

"\u20AC\u00A3\u00A5$\n"

Таким образом, вы можете видеть, что равно U + 20AC , £ равно U + 00A3 , а ¥ равно U + 00A5, ($ не конвертируется, так как это прямой ASCII, хотя технически это U + 0024 . Приведенный ниже код может быть изменен для предоставления этой информации, если она вам действительно нужна. Или просто добавьте начальные обнуляет шестнадцатеричные значения из таблицы ASCII - или ссылается на уже существующую .)

(Примечание: предыдущий ответ предложил использовать #inspect вместо #dump. Что иногда работает, но не всегда. Например, работает ruby -E UTF-8 -e 'puts "\u{1F61E}".inspect' печатает для меня несчастное лицо, а не escape-последовательность. Изменение inspect на dump, однако, возвращает мне escape-последовательность.)

Метод 1b: с Ruby с использованием String#encode и rescue:

Теперь, если вы попробуете вышеупомянутое с большим входным файлом, вышеприведенное может оказаться громоздким - может быть трудно даже найти escape-последовательности в файлах с в основном текстом ASCII, или может быть трудно определить, какие последовательности идут с какими персонажами. В таком случае можно заменить вторую строку выше следующим:

encodings = {} # hash to store mappings in
s.split("").each do |c| # loop through each "character"
  begin
    c.encode("ASCII") # try to encode it to ASCII
  rescue Encoding::UndefinedConversionError # but if that fails
    encodings[c] = $!.error_char.dump # capture a dump, mapped to the source character
  end
end
# And then print out all the captured non-ASCII characters:
encodings.each do |char, dumped|
  puts "#{char} encodes to #{dumped}."
end

С тем же вводом, что и выше, будет напечатано:

€ encodes to "\u20AC".
£ encodes to "\u00A3".
¥ encodes to "\u00A5".

Обратите внимание, что это может вводить в заблуждение. Если на входе есть символов для объединения , то на выходе будет напечатан каждый компонент отдельно. Например, для ввода ?? ў ў вывод будет:

? encodes to "\u{1F64B}".
? encodes to "\u{1F3FE}".
ў encodes to "\u045E".
у encodes to "\u0443".                                                                                                      ̆
 encodes to "\u0306".

Это потому, что ?? фактически кодируется как две кодовые точки: базовый символ (? - U + 1F64B ), с модификатором (?, U + 1F3FE ; см. Также ). Аналогично с одна из букв: первая, ў, представляет собой одну предварительно комбинированную кодовую точку ( U + 045E ), а вторая, ў - хотя она выглядит так же - формируется путем объединения у ( U + 0443 ) с модификатором ̆ ( U + 0306 ), который может или не может правильно отображаться, в том числе на этом страница, так как она не предназначена для одиночества). Поэтому, в зависимости от того, что вы делаете, вам, возможно, придется остерегаться таких вещей (которые я оставляю в качестве упражнения для читателя).

Метод 2a: из веб-инструментов: конкретные символы:

В качестве альтернативы, если у вас есть, скажем, электронное письмо с символом в нем, и вы хотите найти значение кодовой точки для кодирования, если вы просто выполните поиск этого символа в Интернете, вы часто будете находить Разнообразие страниц, которые дают детали юникода для конкретного символа. Например, если я выполню поиск в Google для , я получу, среди прочего, запись в викисловарь , страницу википедии и страница на fileformat.info , которую я считаю полезным для получения информации о конкретных символах Юникода. И на каждой из этих страниц указан тот факт, что эта галочка представлена ​​кодовой точкой Unicode U + 2713. (Кстати, поиск в этом направлении тоже работает хорошо.)

Метод 2b: из веб-инструментов: по названию / концепции:

SimilaНаоборот, можно искать символы юникода для соответствия определенной концепции. Например, я искал выше для галочки Unicode , и даже в фрагменте Google был список нескольких кодовых точек с соответствующей графикой, хотя я также нахожу этот список нескольких проверок помечайте символы и даже « список полезных символов », в котором есть множество вещей, включая различные галочки.

Аналогичным образом это можно сделать для акцентированных символов, смайликов и т. Д. Просто выполните поиск по слову «Юникод» вместе со всем, что вы ищете, и вы будете получать результаты, включающие страницы со списком кодовых точек. , Что приводит нас к тому, чтобы вернуть это в рубин:


Представление значения, если оно у вас есть:

Документация Ruby для строковых литералов описывает два способа представления символов Юникода в качестве escape-последовательностей:

\unnnn Символ Unicode, где nnnn - это ровно 4 шестнадцатеричные цифры ([0-9a-fA-F])

\u{nnnn ...} Символы Unicode, где каждый nnnn - это 1-6 шестнадцатеричных цифр ([0-9a-fA-F])

То есть для кодовых точек с 4-значным представлением, например, U + 2713 сверху, вы должны ввести (в пределах строкового литерала , то есть , а не в одинарных кавычках ) это как \u2713. А для любого символа Юникода (независимо от того, вписывается он в 4 цифры или нет), вы можете использовать фигурные скобки ({ и }) вокруг полного шестнадцатеричного значения для кодовой точки, например, \u{1f60d} для ?. Эту форму также можно использовать для кодирования нескольких кодовых точек в одной escape-последовательности, разделяя символы с помощью пробела . Например, \u{1F64B 1F3FE} приведет к базовому символу ? плюс модификатор ?, что в конечном итоге приведет к абстрактному символу ?? (как видно выше).

Это работает и с более короткими кодами. Например, эта строка символов валюты сверху (€£¥$) может быть представлена ​​с помощью \u{20AC A3 A5 24} - для трех символов требуется всего 2 цифры.

0 голосов
/ 13 июля 2017

попробуйте этот драгоценный камень.Он преобразует Unicode или не-ASCII знаки препинания и символы в ближайшие знаки ASCII и символы

https://github.com/qwuen/punctuate

пример использования: "100 ٪". ​​Punctuate => "100%"

камень использует для преобразования ссылку в https://lexsrv3.nlm.nih.gov/LexSysGroup/Projects/lvg/current/docs/designDoc/UDF/unicode/DefaultTables/symbolTable.html.

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