Aby przekonwertować ciąg na UTF-8 i zastąpić wszystkie błędy kodowania, można zrobić:Jak mogę zamienić błędy w UTF-8 w Ruby bez konwersji na inne kodowanie?
str.encode('utf-8', :invalid=>:replace)
Jedyny problem polega na tym, że nie działa, jeśli jest już str
UTF-8, w którym sprawa jakieś błędy pozostają:
irb> x = "foo\x92bar".encode('utf-8', :invalid=>:replace)
=> "foo\x92bar"
irb> x.valid_encoding?
=> false
zacytować Ruby Docs:
Należy pamiętać, że konwersja z kodowaniem
enc
do S kodowanie ameenc
jest operacją "no-op", tzn. odbiornik jest zwracany bez żadnych zmian i nie są zgłaszane żadne wyjątki, nawet jeśli są niepoprawne bajty.
Oczywistym rozwiązaniem jest najpierw przekonwertować do innego kodowania Unicode, a następnie z powrotem na UTF-8
str.encode('utf-16', :invalid=>:replace).encode('utf-8')
Na przykład:
irb> x = "foo\x92bar".encode('utf-16', :invalid=>:replace).encode('utf-8')
=> "foo�bar"
irb> x.valid_encoding?
=> true
Czy istnieje lepszy sposób to zrobić to bez konwersji na fałszywe kodowanie?
Dzięki za informacje! Niestety, utknąłem z Ruby 1.9 i nie będę mógł dokonać aktualizacji (przynajmniej na ten projekt). – Matt
Użyj można użyć klej 'scrub_rb' we wcześniejszych wersjach Ruby –