Ako odstránim znaky iné ako UTF8 z reťazca Ruby? Mám reťazec, ktorý obsahuje napríklad „xC2“. Chcem odstrániť tento znak zo reťazca, aby sa stal platným UTF8.
toto:
text.gsub!(/xC2/, "")
vráti chybu:
incompatible encoding regexp match (ASCII-8BIT regexp with utf-8 string)
Pozrel som sa tiež na text.unpack („U *“) a string.pack, ale nikam som sa nedostal.
odpovede:
68 pre odpoveď č. 1Môžete na to použiť kódovanie.
text.encode("utf-8", :invalid => :replace, :undef => :replace)
Viac informácií nájdete Ruby-Docs
7 pre odpoveď č. 2
Môžete to urobiť takto
# encoding: utf-8
class String
def validate_encoding
chars.select(&:valid_encoding?).join
end
end
puts "testingxC2 a non utf-8 string".validate_encoding
#=>testing a non utf-8 string
4 pre odpoveď č. 3
Vyskúšajte Iconv
1.9.3p194 :001 > require "iconv"
# => true
1.9.3p194 :002 > string = "testingxC2 a non utf-8 string"
# => "testingxC2 a non utf-8 string"
1.9.3p194 :003 > ic = Iconv.new("utf-8//IGNORE", "utf-8")
# => #<Iconv:0x000000026c9290>
1.9.3p194 :004 > ic.iconv string
# => "testing a non utf-8 string"
3 pre odpoveď č. 4
Môžeš použiť /n
, ako v
text.gsub!(/xC2/n, "")
donútiť Regexp pracovať na bajtoch.
Ste si istý, že toto je to, čo chcete? Akýkoľvek znak Unicode v rozsahu [U + 80, U + BF] bude mať znak a xC2
vo forme kódovanej utf-8.
1 pre odpoveď č. 5
Najlepším riešením tohto problému, ktorý som našiel, je odpoveď na rovnakú otázku: https://stackoverflow.com/a/8711118/363293.
V skratke: "€fooxA0".chars.select(&:valid_encoding?).join
1 pre odpoveď č. 6
Váš text má kódovanie ASCII-8BIT, namiesto toho by ste mali použiť toto:
String.delete!("^u{0000}-u{007F}");
Bude to mať rovnaký účel.
-1 pre odpoveď č. 7
data = "" if not (data.force_encoding("utf-8").valid_encoding?)