如何使用Ruby转义Unicode字符串?

Dog*_*her 11 ruby unicode

我需要使用反斜杠将Unicode字符串编码/转换为其转义形式.谁知道怎么样?

Jon*_*sen 23

在Ruby 1.8.x中,String#inspect可能是您正在寻找的,例如

>> multi_byte_str = "hello\330\271!"
=> "hello\330\271!"

>> multi_byte_str.inspect
=> "\"hello\\330\\271!\""

>> puts multi_byte_str.inspect
"hello\330\271!"
=> nil
Run Code Online (Sandbox Code Playgroud)

在Ruby 1.9中,如果您希望多字节字符使其组件字节转义,您可能想要说:

>> multi_byte_str.bytes.to_a.map(&:chr).join.inspect
=> "\"hello\\xD8\\xB9!\""
Run Code Online (Sandbox Code Playgroud)

在Ruby 1.8和1.9中,如果你对(转义的)unicode代码点感兴趣,你可以这样做(虽然它也逃脱了可打印的东西):

>> multi_byte_str.unpack('U*').map{ |i| "\\u" + i.to_s(16).rjust(4, '0') }.join
=> "\\u0068\\u0065\\u006c\\u006c\\u006f\\u0639\\u0021"
Run Code Online (Sandbox Code Playgroud)


Ric*_*der 13

要在Ruby中使用unicode字符,请使用"\ uXXXX"转义符; 其中XXXX是UTF-16代码点.见http://leejava.wordpress.com/2009/03/11/unicode-escape-in​​-ruby/

  • 对于Ruby 1.8,你可以使用`["XXXX".to_i(16)].pack("U*")` (6认同)
  • @lindes是的,还值得注意的是 pack 函数也适用于 `["1f60d".to_i(16)].pack("U*")`。目前还不是很明显。:) (2认同)

mu *_*ort 8

如果你有Rails,你可以使用JSON编码器:

require 'active_support'
x = ActiveSupport::JSON.encode('µ')
# x is now "\u00b5"
Run Code Online (Sandbox Code Playgroud)

通常的非Rails JSON编码器不会"\ u"-ify Unicode.


lin*_*des 5

据我了解,您的问题有两个组成部分:查找字符的数值,以及在 Ruby 中将此类值表示为转义序列。此外,前者取决于您的出发点是什么。

\n

求值:

\n

方法 1a:从 Ruby 使用String#dump

\n

如果您已经在 RubyString对象中拥有该字符(或者可以轻松地将其放入一个对象中),那么这可能就像在repl中显示该字符串一样简单(取决于Ruby 环境中的某些设置)。如果没有,你可以调用#dump它的方法。例如,对于一个名为unicode.txt\xe2\x80\x93 的文件,其中包含一些 UTF-8 编码数据,货币符号\xe2\x82\xac\xc2\xa3\xc2\xa5$(加上尾随换行符) \xe2\x80\x93 运行以下代码(在或中执行irb)一个脚本):

\n
s = File.read("unicode.txt", :encoding => "utf-8") # this may be enough, from irb\nputs s.dump # this will definitely do it.\n
Run Code Online (Sandbox Code Playgroud)\n

...应该打印出:

\n
"\\u20AC\\u00A3\\u00A5$\\n"\n
Run Code Online (Sandbox Code Playgroud)\n

因此您可以看到\xe2\x82\xacU+20AC\xc2\xa3U+00A3\xc2\xa5U+00A5($未转换,因为它是直接 ASCII,尽管从技术上讲它是U+0024。如果您确实需要,可以修改下面的代码以提供该信息。或者只需将前导零添加到十六进制值中ASCII 表 \xe2\x80\x93 或已经这样做的参考表。)

\n

(注意:之前的答案建议使用#inspect而不是#dump。这有时有效,但并非总是有效。例如,运行会ruby -E UTF-8 -e \'puts "\\u{1F61E}".inspect\'为我打印一张不高兴的脸,而不是转义序列。不过,更改inspectdump,可以让我恢复转义序列。)

\n

方法 1b:在 Ruby 中使用String#encodeand rescue

\n

现在,如果您尝试使用更大的输入文件执行上述操作,则上述操作可能会变得笨拙 \xe2\x80\x93 甚至可能很难在主要包含 ASCII 文本的文件中找到转义序列,或者可能很难识别哪些序列与哪些字符对应。在这种情况下,可以将上面的第二行替换为以下内容:

\n
encodings = {} # hash to store mappings in\ns.split("").each do |c| # loop through each "character"\n  begin\n    c.encode("ASCII") # try to encode it to ASCII\n  rescue Encoding::UndefinedConversionError # but if that fails\n    encodings[c] = $!.error_char.dump # capture a dump, mapped to the source character\n  end\nend\n# And then print out all the captured non-ASCII characters:\nencodings.each do |char, dumped|\n  puts "#{char} encodes to #{dumped}."\nend\n
Run Code Online (Sandbox Code Playgroud)\n

使用与上面相同的输入,将打印:

\n
\xe2\x82\xac encodes to "\\u20AC".\n\xc2\xa3 encodes to "\\u00A3".\n\xc2\xa5 encodes to "\\u00A5".\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,这可能有点误导。如果输入中存在组合字符,则输出将单独打印每个组成部分。例如,对于 的输入 \xd1\x9e \xd1\x83\xcc\x86,输出将为:

\n
 encodes to "\\u{1F64B}".\n encodes to "\\u{1F3FE}".\n\xd1\x9e encodes to "\\u045E".\n\xd1\x83 encodes to "\\u0443".                                                                                                      \xcc\x86\n encodes to "\\u0306".\n
Run Code Online (Sandbox Code Playgroud)\n

这是因为实际上被编码为两个代码点:一个基本字符 ( - U+1F64B ),带有修饰符 ( , U+1F3FE另请参阅)。与其中一个字母类似:第一个\xd1\x9e, 是单个预组合代码点 ( U+045E ),而第二个\xd1\x83\xcc\x86\xe2\x80\x93 尽管看起来相同 \xe2\x80\x93 是通过组合形成的\xd1\x83( U+0443 ) 与修饰符 \xcc\x86( U+0306 - 可能会或可能不会正确呈现,包括在本页上,因为它并不意味着独立)。因此,根据您正在做的事情,您可能需要注意这些事情(我将其作为练习留给读者)。

\n

方法 2a:通过基于 Web 的工具:特定字符:

\n

或者,如果您有一封电子邮件,其中包含一个字符,并且您想要找到要编码的代码点值,如果您只是对该字符进行网络搜索,您经常会发现各种提供特定字符的 unicode 详细信息的页面。例如,如果我在google 上搜索\xe2\x9c\x93,除其他外,我会得到一个维基词典条目一个维基百科页面一个 fileformat.info 页面,我发现这是一个有用的网站,用于获取有关特定 unicode 字符的详细信息。这些页面中的每一页都列出了该复选标记由 unicode 代码点 U+2713 表示的事实。(顺便说一句,朝那个方向搜索也很有效。)

\n

方法 2b:通过基于 Web 的工具:按名称/概念:

\n

类似地,可以搜索 unicode 符号来匹配特定概念。例如,我在上面搜索了unicode复选标记,甚至在Google代码片段上也列出了几个带有相应图形的代码点,尽管我也找到了几个复选标记符号的列表,甚至是“有用符号列表”其中有很多东西,包括各种复选标记。

\n

对于重音字符、表情符号等也可以类似地执行此操作。只需搜索单词“unicode”以及您要查找的其他内容,您往往会得到包含列出代码点的页面的结果。然后我们将其放回到 ruby​​ 中:

\n
\n

代表价值,一旦你拥有它:

\n

字符串文字的 Ruby 文档描述了两种将 unicode 字符表示为转义序列的方法:

\n
\n

\\unnnn Unicode 字符,其中 nnnn 恰好是 4 个十六进制数字 ([0-9a-fA-F])

\n

\\u{nnnn ...} Unicode 字符,其中每个 nnnn 是 1-6 个十六进制数字 ([0-9a-fA-F])

\n
\n

因此,对于具有 4 位表示形式的代码点,例如上面的 U+2713,您可以将其输入(在不带引号的字符串文字内)。对于任何 unicode 字符(无论是否适合 4 位数字),您可以在代码点的完整十六进制值周围使用大括号 (和),例如. 此形式还可用于在单个转义序列中对多个代码点进行编码,并用空格分隔字符。例如,将产生基本字符加上修饰符,从而最终产生抽象字符(如上所示)。\\u2713{}\\u{1f60d}\\u{1F64B 1F3FE}

\n

这也适用于较短的代码点。例如,上面的货币字符串 ( \xe2\x82\xac\xc2\xa3\xc2\xa5$) 可以用 \xe2\x80\x93 表示,其中\\u{20AC A3 A5 24}三个字符仅需要 2 位数字。

\n