1

另一个问题中,有人询问如何替换元音变音。接受的问题是以下代码:

# encoding: utf-8
foo = "ich bin doch nicht blöd, mann!".gsub(/[äöü]/) do |match|
    case match
        when "ä" 'ae'
        when "ö" 'oe'
        when "ü" 'ue'
    end
end
puts foo

但是,当我尝试运行它时,输出是:

$ ruby /tmp/test.rb 
ich bin doch nicht bld, mann!

因此,元音变音显然不会被替换。有什么我想念的吗?我正在使用 Ruby 1.9.3p362(2012-12-25 修订版 38607)[x86_64-linux]

4

3 回答 3

7

您使用的语法不正确,您需要使用then或使用换行符和缩进。

# encoding: utf-8
foo = "ich bin doch nicht blöd, mann!".gsub(/[äöü]/) do |match|
    case match
        when "ä" then 'ae'
        when "ö" then 'oe'
        when "ü" then 'ue'
    end
end

puts foo

或者

# encoding: utf-8
foo = "ich bin doch nicht blöd, mann!".gsub(/[äöü]/) do |match|
    case match
        when "ä"
            "ae"
        when "ö"
            "oe"
        when "ü"
            "ue"
    end
end

执行此操作的可靠方法是,result = Iconv.iconv('ascii//ignore//translit', 'utf-8', foo)但您需要设置"de_DE"在没有 ac 扩展的情况下无法在 ruby​​ 中完成的语言环境。

于 2013-01-11T22:22:10.423 回答
2
"ich bin doch nicht blöd, mann!".gsub("ä","ae").gsub("ö","oe").gsub("ü","ue")

应该做的伎俩

于 2013-01-11T22:19:53.827 回答
2

(不是问题的真正答案,但对于评论来说有点大。)gsub具有这种替换的语法,使用哈希:

#encoding: utf-8
table = {"ä" => 'ae',
         "ö" => 'oe',
         "ü" => 'ue'}
re = Regexp.union(table.keys)
# re = /[äöü]/ # is fine too
p "ich bin doch nicht blöd, mann!".gsub(re, table)
# => "ich bin doch nicht bloed, mann!"
于 2013-01-11T22:48:04.320 回答