不可能用gsub替换字符

时间:2015-06-03 13:11:21

标签: ruby-on-rails ruby character-encoding

我们首先导入一个文件并在文件中为特殊的火山口我尝试编码方法并解码ruby并且没有任何反应,所以我使用了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

我不明白为什么他不想接受我的角色̤̩

2 个答案:

答案 0 :(得分: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 :(得分: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