2015-06-03 98 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