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

Posted

技术标签:

【中文标题】在Ruby中将unicode代码点转换为字符串字符【英文标题】:Convert unicode codepoint to string character in Ruby 【发布时间】:2011-10-22 00:51:20 【问题描述】:

我有来自 unicode 数据库的这些值,但我不确定如何将它们转换为人类可读的形式。这些到底叫什么?

他们在这里:

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

如何将这些转换为可读的符号?

【问题讨论】:

@Gabriel 我不知道你想对 UCS-2 说什么?这不是“符号编码”。这是一个过时的序列化方案,不再适用于 Unicode,并且自 Unicode 1.1 以来就不再适用,这是无限永远的。 【参考方案1】:

怎么样:

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

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

在 Ruby 1.9+ 中你也可以这样做:

puts "\u2B71F"

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

【讨论】:

您也可以只使用十六进制文字:[0x2B71F].pack 'U'【参考方案2】:

U+2B71F 这样的unicode 符号被称为codepoint

unicode 系统为多种世界语言、科学符号、货币等中的每个字符定义了一个唯一的codepoint。这个字符集正在稳步增长。

例如,U+221E 是无穷大。

codepoints 是十六进制数字。每个字符总是定义一个数字。

有很多方法可以在内存中安排它。这称为encoding,其中常见的是UTF-8UTF-16。来回转换定义明确。

在这里,您很可能正在寻找将 unicode codepoint 转换为 UTF-8 字符。

codepoint = "U+2B71F"

您需要提取U+ 之后的十六进制部分并仅获得2B71F。这将是第一次集体捕获。 See this.

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")

参考资料:

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

【讨论】:

codepoint 是“U+2B71F”。为了从中提取“2B71F”,我将它与一个 unicode 正则表达式匹配。正则表达式中定义了一组用于提取“2B71F”。比赛结束后,如果有的话,在这种情况下你可以用 $1 来引用它。 Follow this rubular permalink to see the regex in action. 我在 SO 上读过的关于 unicode、utf-8 代码点、字符集、编码等的最佳答案之一......而且链接非常棒。 joelonsoftware.com/articles/Unicode.html 特别适合。

以上是关于在Ruby中将unicode代码点转换为字符串字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将字符串从十进制代码转换为西里尔文/unicode16?

在 C++ 中将 std::string 转换为 Unicode 字符串

有一种方法可以在 python 中将字符串转换为 unicode 字符串?

在 Python 中将 XML/HTML 实体转换为 Unicode 字符串 [重复]

在 Python 中将 XML/HTML 实体转换为 Unicode 字符串 [重复]

在java中将UTF-16 unicode字符转换为UTF-8