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

Это не ответ, пожалуйста, объясните сами, потому что это выглядит точно так же, за исключением порядка в 'Hash' – 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

'name. gsub! (Regexp.union (chars.keys), символы) 'менее хаки. – steenslag

+0

@steenslag Спасибо. Я часто не использую фактический класс 'Regexp', поэтому я не знал об этом методе. Обновлено мое сообщение. – engineersmnky

Смежные вопросы