2013-01-11 36 views
1

another question有人问到如何更换Umlaute。接受的问题是,下面的代码:为什么这个Unicode gsub替换在Ruby中不起作用?

# 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! 

所以Umlaute显然没有得到更换。 有什么我失踪?我使用Ruby 1.9.3p362(2012-12-25修订38607)x86_64的Linux的]

回答

2
"ich bin doch nicht blöd, mann!".gsub("ä","ae").gsub("ö","oe").gsub("ü","ue") 

应该做的伎俩

+0

这是快速和作品。谢谢!任何想法为什么其他代码不起作用? (我会在10分钟内接受你的答案,因为这是接受之前等待的最短时间) –

+2

这真的很难看(想想,ä,Ö,ö,Ü,ü和ß;éè等) – steenslag

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"不能在Ruby中完成而无需C扩展。 (不是一个真正的问题的答案,但对于一个评论有点大)

+0

它的有趣的红宝石并没有提示失踪语句的警告! +1 – cggaurav

+6

@cggaurav通常忽略'then'将会是一个语法错误,但是将两个字符串文字相邻放在一起实际上在语法上是有效的。写''ä''ae''与写作''äae“'相同。这是Ruby从C继承的语法古怪。 – sepp2k

+0

我在Ruby核心开发人员网站上阅读了关于在两个文字位于同一行时废弃此功能的讨论。这似乎是它没有用的共识。 – sawa

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!" 
+0

我最近看到这个提到了三次。两次由你和一次由我。 – sawa

+1

我有一个秘密议程:),我想Regexp.union的东西是自动的,留下语法'gsub(hash)'。但此功能目前尚不清楚。 – steenslag

+0

我同意。我也有同感。 – sawa

相关问题