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

时间:2011-04-06 02:45:27

标签: ruby unicode

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

6 个答案:

答案 0 :(得分:22)

在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

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

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

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

答案 1 :(得分:13)

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

答案 2 :(得分:8)

如果您已经开始使用Rails,可以使用JSON编码器:

require 'active_support'
x = ActiveSupport::JSON.encode('µ')
# x is now "\u00b5"

通常的非Rails JSON编码器不会“\ u”-ify Unicode。

答案 3 :(得分:3)

如果您只是将#Encoding: UTF-8添加到文件顶部,则可以直接使用unicode字符。然后你可以在源代码中自由使用ä,ǹ,ú等。

答案 4 :(得分:0)

据我所知,您的问题有两个组成部分:查找字符的数字值,并在Ruby中将这些值表示为转义序列。此外,前者取决于您的起点。

查找值:

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

如果您已经在Ruby String对象中包含了该字符(或可以很容易地将其整合为一个对象),那么这就像在repl中显示字符串一样简单(取决于{{3 }}在您的Ruby环境中)。如果没有,您可以在其上调用certain settings方法。例如,对于一个名为unicode.txt的文件,其中包含一些UTF-8编码数据-例如,货币符号€£¥$(加上结尾的换行符)–运行以下代码(在{{ 1}}或作为脚本):

irb

...应该打印出来:

s = File.read("unicode.txt", :encoding => "utf-8") # this may be enough, from irb
puts s.dump # this will definitely do it.

因此,您可以看到"\u20AC\u00A3\u00A5$\n" #dumpU+20AC£U+00A3({¥不会转换,因为它是直接的ASCII,尽管从技术上来说是U+00A5。如果您确实需要,可以修改下面的代码以提供该信息,或者仅在其中添加前导零。 ASCII表中的十六进制值-或引用为U+0024。)

(注意:建议使用one that already does so代替$的{​​{3}}。有时 可行,但并非总是如此。例如,运行{{1} }为我打印一张不高兴的脸,而不是转义序列。但是,将#dump更改为ruby -E UTF-8 -e 'puts "\u{1F61E}".inspect'会使我得到转义序列。)

方法1b:使用Ruby使用inspectdump

现在,如果您尝试使用较大的输入文件进行上述操作,则上述操作可能会变得很笨拙–甚至在包含大多数ASCII文本的文件中甚至都很难找到转义序列,或者可能很难确定哪个序列去了用哪个字符。在这种情况下,可以用以下内容替换上面的第二行:

String#encode

使用与上述相同的输入,然后将打印:

rescue

请注意,这可能会引起误解。如果输入中有previous answer,则输出将分别打印每个组件。例如,对于encodings = {} # hash to store mappings in s.split("").each do |c| # loop through each "character" begin c.encode("ASCII") # try to encode it to ASCII rescue Encoding::UndefinedConversionError # but if that fails encodings[c] = $!.error_char.dump # capture a dump, mapped to the source character end end # And then print out all the captured non-ASCII characters: encodings.each do |char, dumped| puts "#{char} encodes to #{dumped}." end 的输入,输出将是:

€ encodes to "\u20AC".
£ encodes to "\u00A3".
¥ encodes to "\u00A5".

这是因为 ў ў实际上被编码为两个代码点:基本字符( encodes to "\u{1F64B}". encodes to "\u{1F3FE}". ў encodes to "\u045E". у encodes to "\u0443". ̆ encodes to "\u0306". -#inspect),带有修饰符(,{{3} }; combining characters)。与其中一个字母类似:第一个是单个预组合代码点(U+1F64B),而第二个 –它看起来是一样的–是通过将ўU+1F3FE)与修饰符ўsee also组合而成的,修饰符可能会或可能不会正确显示,包括在此页面上,因为这并不意味着要独立存在)。因此,根据您的工作,您可能需要提防这些事情(我留给读者练习)。

方法2a:基于网络的工具:特定字符:

或者,如果您有一封电子邮件,其中包含一个字符,并且您想找到要编码的代码点值,如果您只是对该字符进行网络搜索,则经常会发现一个提供特定字符的unicode详细信息的各种页面。例如,如果我做U+045E,除其他外,我会得到U+0443U+0306a google search for ,这对我来说是获取详细信息的有用站点特定的unicode字符。这些页面中的每一个都列出了以下事实:该复选标记由Unicode代码点U + 2713表示。 (顺便说一下,a wiktionary entry也很好用。)

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

同样,人们可以搜索unicode符号以匹配特定的概念。例如,我在上面搜索了a wikipedia page,即使在Google代码段中,也列出了带有相应图形的几个代码点,尽管我还发现了a page on fileformat.info包含多个复选标记符号,甚至还有一个“ searching in that direction”中包含很多内容,包括各种复选标记。

类似地,可以对重音符号,表情符号等执行此操作。只需搜索“ unicode”一词以及您要查找的其他内容,您将趋向于获得包含列出代码点页面的结果。然后,我们将其放回红宝石中:


代表值,一旦您拥有它:

unicode check marks描述了两种将Unicode字符表示为转义序列的方法:

  

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

     

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

因此对于具有4位数字表示形式的代码点,例如从上面的U + 2713,您将在\unnnn中(在this list内的list of useful symbols中输入)。对于任何Unicode字符(无论它是否适合4位数字),您都可以在代码点的完整十六进制值周围使用大括号(\u{nnnn ...}\u2713),例如{的{​​{1}}。此格式还可用于在单个转义序列中编码多个代码点,并用Ruby documentation for string literals分隔字符。例如,}将导致基本字符\u{1f60d}加上修饰符,从而最终产生string literal \u{1F64B 1F3FE}(如上所示)。

这也适用于较短的代码点。例如,上面的货币字符串(可以用表示–三个字符仅需要2位数字。

答案 5 :(得分:-1)

试试这个宝石。它将Unicode或非ASCII标点符号转换为最接近的ASCII标点和符号

https://github.com/qwuen/punctuate

示例用法: “100%”。圈点 => “100%”

gem使用https://lexsrv3.nlm.nih.gov/LexSysGroup/Projects/lvg/current/docs/designDoc/UDF/unicode/DefaultTables/symbolTable.html中的引用进行转换。