2015-06-03 70 views
0

我們導入一個文件,然後在那裏的特殊火山口文件中,我嘗試編碼方法和解碼紅寶石,什麼也沒有發生,所以我用gsub。 工作它潮溼作爲字符組̩̤ 其餘沒有問題替換我。不可能用gsub替換字符

此方法代替

def replace_chars(name) 

    chars = { 
      "Ž" => 'é', 
      "Â" => "ç", 
      "‘" => "ë", 
      "â„¢" => "ô", 
      "̤" => "ç", 
      "Ì©" => "é", 
      "•" => "ï" 
     } 

    puts "before #{name}" 
    chars.each do |key,value| 
    name.gsub!(key,value) 
    end 
    puts "after #{name}" 
end 

,如果我,但我的方法

replace_chars('̤liver Žponime') 

這裏提出的方法的輸出,第一他沒有成功地改變了這個詞,但在第二個他做出了改變。

輸出:after ÃŒç¤liver éponime

我不明白爲什麼他不希望把我的性格̤̩

回答

0

這種替換代碼:

def replace_chars(name) 
    chars = { 
     "̤" => "ç", 
     "Ì©" => "é", 
     "•" => "ï", 
     "â„¢" => "ô", 
     "Ž" => 'é', 
     "‘" => "ë", 
     "Â" => "ç"   
    } 
    puts "before #{name}" 
    chars.each do |key,value| 
    name.gsub!(key,value) 
    end 
    puts "after #{name}" 
end 

replace_chars('̤liver Žponime') 
before ̤liver Žponime 
after çliver éponime 
+1

這不是一個答案,請實際解釋自己,因爲這看起來完全一樣,除了'哈希'的順序 – engineersmnky

+0

首先,你需要匹配字符數降序'̤',希望這有助於 – Prashant4224

2

這裏是另一個解決方案,將避免需要遍歷所有的字符,將取代火柴。 @ Prashant4020是正確的,您需要在執行此操作之前按降序排列鍵或至少按鍵排序,因爲Â現在將匹配並替換爲̤之前。

def replace_chars(name 
    chars = { 
    "̤" => "ç", 
    "Ì©" => "é", 
    "•" => "ï", 
    "â„¢" => "ô", 
    "Ž" => 'é', 
    "‘" => "ë", 
    "Â" => "ç" 
} 
    #name.gsub!(/#{chars.keys.join('|')}/,chars) 
    #as suggested by @steenslag Regexp::union is definitely less of a hack 
    name.gsub!(Regexp.union(chars.keys),chars) 
    #translates to name.gsub!(/̤|Ì©"|•|â„¢|Ž|‘|Â/,{"̤" => "ç","Ì©"=>"é","•"=>"ï","â„¢"=>"ô","Ž"=>'é',"‘"=>"ë","Â"=>"ç"}) 
end 

這將創建一個正則表達式將從chars哈希匹配鍵,然後使用這些值來代替鑰匙。將不會調用gsub!中根本不存在name中的密鑰。

+1

'名稱。 gsub!(Regexp.union(chars.keys),chars)'不那麼討厭。 – steenslag

+0

@steenslag謝謝。我不經常使用實際的'Regexp'類,所以我不知道這種方法。更新了我的帖子。 – engineersmnky