在Ruby中将Unicode码点转换为字符串字符

20

我从一个Unicode数据库中得到了这些值,但我不确定如何将它们转换为易于人类阅读的形式。它们通常被称为什么?

这就是这些值:

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

我该如何将它们转换成可读的符号?


@Gabriel,我不知道你在说UCS-2什么?它不是“符号编码”。它是一种过时的序列化方案,在Unicode上已经不再起作用,自Unicode 1.1以来,这已经是无限远的过去了。 - tchrist
2个回答

37

如何:

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

# Using chr
puts (0x2B71F).chr(Encoding::UTF_8)

在 Ruby 1.9+ 版本中,你还可以这样做:

puts "\u{2B71F}"

\u{}转义序列可用于解码Unicode代码点。


3
你也可以使用十六进制字面量: [0x2B71F].pack 'U' - Andrew Marshall

19
unicode符号(例如U+2B71F)被称为“代码点”。Unicode系统为世界各语言、科学符号、货币等中的每个字符定义了一个独特的“代码点”。该字符集不断增长。例如,U+221E代表无穷大。这些“代码点”是十六进制数。每个字符始终仅定义一个数。有许多方法将其排列在内存中,这称为“编码”,常见的编码方式为UTF-8和UTF-16。转换过程是明确定义的。在这里,您最可能想要将Unicode“代码点”转换为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. 使用Module#const_missing将Unicode代码点转换为UTF-8字符
  2. Tim Bray关于Unicode的好处
  3. Joel Spolsky - 关于Unicode和字符集软件开发人员必须掌握的绝对最低限度(不能有任何借口!)
  4. 解析Unicode正则表达式

codepoint 是 "U+2B71F"。为了从中提取出 "2B71F",我使用了一个 Unicode 正则表达式进行匹配。在正则表达式中定义了一个用于提取 "2B71F" 的组。匹配后,如果存在这个组,你可以通过 $1 来引用它。[点击此 rubular 链接查看正则表达式的实际应用。] (http://rubular.com/r/fXocVSS7ZS) - Ocaj Nires
2
这是我在SO上读过的关于Unicode、UTF-8编码点、字符集、编码等方面最好的答案之一……而且提供的链接也特别棒。http://www.joelonsoftware.com/articles/Unicode.html 尤其详尽准确。 - AJP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接