Преобразование кодовой точки Unicode в строковый символ в Ruby - PullRequest
17 голосов
/ 08 августа 2011

У меня есть эти значения из базы данных Unicode, но я не уверен, как перевести их в удобочитаемую форму. Как они вообще называются?

Вот они:

  • U+2B71F
  • U+2A52D
  • U+2A68F
  • U+2A690
  • U+2B72F
  • U+2B4F7
  • U+2B72B

Как я могу преобразовать их в читаемые символы?

Ответы [ 2 ]

34 голосов
/ 08 августа 2011

Как насчет:

puts ["2B71F".hex].pack("U")

Редактировать

В Ruby 1.9 вы даже можете сделать это:

puts "\u{2B71F}"

т.е. escape-последовательность \u{} может использоваться для декодирования кодовых точек Unicode.

19 голосов
/ 08 августа 2011

Символы Unicode, такие как U+2B71F, обозначаются как codepoint.

Система Unicode определяет уникальный codepoint для каждого символа во множестве мировых языков, научных символов, валют и т. Д. Этот набор символов постоянно растет.

Например, U+221Eэто бесконечность.

codepoints - шестнадцатеричные числа.Для каждого символа всегда определено только одно число.

Есть много способов упорядочить это в памяти.Это известно как encoding, из которых наиболее распространенными являются UTF-8 и UTF-16.Преобразование туда и сюда хорошо определено.

Здесь вы, скорее всего, ищете преобразование юникода codepoint в UTF-8 символов.

codepoint = "U+2B71F"

Вам необходимо извлечь шестнадцатеричную частьпосле U+ и получите только 2B71F.Это будет первый захват группы. См. Это .

codepoint.to_s =~ /U\+([0-9a-fA-F]{4,5}|10[0-9a-fA-F]{4})$/

И ваш символ UTF-8 будет:

utf_8_character = [$1.hex].pack("U")

Ссылки:

  1. Преобразование кодовых точек Unicode в символы UTF-8 с помощью модуля # const_missing .
  2. Тим Брей о совершенстве Unicode .
  3. Джоэл Спольски -Абсолютный минимум Каждый разработчик программного обеспечения должен абсолютно, положительно знать о юникоде и наборах символов (без оправданий!) .
  4. Рассеивание регулярного выражения Unicode
...