2013-01-11 63 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

相關問題