2011-08-07 18 views
17

Mam te wartości z bazy danych Unicode, ale nie jestem pewien, jak przetłumaczyć je na czytelną dla człowieka formę. Jakie są one nazywane?Konwertuj kodek kodu Unicode na znak łańcuchowy w Ruby

Oto one:

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

Jak mogę zamienić te symbole w czytelne symbole?

+0

@Gabriel nie mam pojęcia, co chce powiedzieć o UCS-2? To nie jest "kodowanie symboli". Jest to przestarzały schemat serializacji, który nie działa już na Unicode, i nie ma od Unicode 1.1, który jest nieskończenie wiecznie temu. – tchrist

Odpowiedz

34

Jak o:

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

Edytuj

W Ruby 1.9 można nawet to zrobić:

puts "\u{2B71F}" 

Tj sekwencję specjalną \u{} można użyć do dekodowania punktów kodowych Unicode.

+0

Wow, wielkie dzięki. – s84

+3

Można również użyć literału hex: '[0x2B71F] .pack 'U''. –

19

Symbole kodu Unicode, takie jak U+2B71F, są określane jako codepoint.

System Unicode definiuje unikalny znak codepoint dla każdego znaku w wielu językach świata, symbolach naukowych, walutach itp. Ten zestaw znaków stale rośnie. Na przykład U+221E jest nieskończonością.

Numer codepoints to liczby szesnastkowe. Zawsze jest dokładnie jedna liczba zdefiniowana na znak.

Istnieje wiele sposobów na uporządkowanie tego w pamięci. Jest to znane jako encoding, z których wspólne to UTF-8 i UTF-16. Konwersja w tę iz powrotem jest dobrze zdefiniowana.

Tutaj najprawdopodobniej szukasz konwersji znaków Unicode codepoint na UTF-8.

codepoint = "U+2B71F" 

trzeba wyodrębnić część sześciokątną pochodzących po U+ i dostać tylko 2B71F. To będzie pierwsze przechwycenie grupy. See this.

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

I jesteś UTF-8 znaków będą:

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

Referencje:

  1. Convert Unicode codepoints to UTF-8 characters with Module#const_missing.
  2. Tim Bray on the goodness of unicode.
  3. Joel Spolsky - The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).
  4. Dissecting the Unicode regular expression
+0

'$ 1' co to jest? Gdzie używasz 'codepoint'? – s84

+0

'codepoint' było" U + 2B71F ". Aby wyodrębnić z niego tylko "2B71F", dopasowuję go do regexu Unicode. W wyrażeniu regularnym dla wyodrębnienia "2B71F" zdefiniowano jedną grupę. Po meczu, jeśli istnieje, możesz odnieść się do niego z 1 $ w tym przypadku. [Śledź ten linkowy odnośnik, aby zobaczyć regex w akcji.] (Http://rubular.com/r/fXocVSS7ZS) –

+2

Jedna z najlepszych odpowiedzi na temat Unicode, punktów kodowych utf-8, zestawów znaków, kodowania itp. Czytałem kiedykolwiek na SO ... i linki są genialne. http://www.joelonsoftware.com/articles/Unicode.html jest szczególnie na miejscu. – AJP