На ваш вопрос, как я понимаю, есть два компонента: поиск числового значения символа и выражение таких значений как 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 цифры.