/ / Odstrániť znaky iné ako UTF z reťazca v Ruby? - rubínový, regulárny, reťazec

Odstrániť-UTF znaky z reťazca v Ruby? - ruby, regex, reťazec

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ď č. 1

Môž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?)