无法用 gsub 替换字符

impossible to replace the character with gsub

我们导入了一个文件,在文件中有一个特殊的坑,首先我尝试了编码方法和解码 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

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

将您的代码替换为:

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

这是另一种解决方案,可以避免迭代所有字符并替换匹配项。 @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 中的键调用。