[ruby] 루비 1.9 : UTF-8에서 유효하지 않은 바이트 시퀀스



4 Answers

받아 들여진 대답이나 다른 대답이 나를 위해 일한다. 이 게시물 을 찾았 습니다.

string.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')

이 문제가 해결되었습니다.

Question

Ruby (1.9)에 많은 무작위 사이트에서 많은 HTML을 사용하는 크롤러를 작성하고 있습니다.
링크를 추출 할 때 nokogiri / hpricot (주요 속도 향상) 대신 .scan(/href="(.*?)"/i) 사용하기로 결정했습니다. 문제는 이제 " invalid byte sequence in UTF-8 "오류가 많이 발생한다는 것입니다.
내가 이해 한 바로는 net/http 라이브러리에는 인코딩 옵션이 없으며 들어오는 내용은 기본적으로 제대로 태그되지 않았습니다.
들어오는 데이터로 실제로 작업하는 가장 좋은 방법은 무엇입니까? 나는 .encode 를 replace와 invalid 옵션 세트로 시도했지만, 지금까지는 성공하지 못했다 ...




scan 을 사용하기 전에 요청 된 페이지의 Content-Type 헤더가 text/html 인지 확인하십시오. UTF-8로 인코딩되지 않은 이미지와 같은 링크가있을 수 있기 때문입니다. 이 페이지는 <link> 엘리먼트와 같은 것으로 href 를 포착했다면 non-html이 될 수도 있습니다. 이를 확인하는 방법은 사용중인 HTTP 라이브러리에 따라 다릅니다. 그런 다음 결과가 String#ascii_only? ascii인지 확인하십시오 String#ascii_only? (HTML은 ascii만을 사용하기 때문에 UTF-8이 아니라 엔티티가 다르게 사용될 수 있습니다). 두 검사가 모두 통과하면 scan 를 사용하는 것이 안전합니다.




필자는 Nakilon의 솔루션이 작동하는 동안 오류를 극복하기 위해 Microsoft Excel에서 생성 된이 이상한 f-ed 문자를 루비에 등록한 CSV로 변환 한 다음 키릴 문자 K를 사용합니다. 루비는 대담한 K이었다. 이것을 고치기 위해서 나는 'iso-8859-1'을 사용했다. CSV.parse(f, :encoding => "iso-8859-1") . 이것은 나의 별난 키가 큰 키릴 문자 K를 훨씬 더 다루기 쉬운 /\xCA/ , string.gsub!(/\xCA/, '')




attachment = file.read

begin
   # Try it as UTF-8 directly
   cleaned = attachment.dup.force_encoding('UTF-8')
   unless cleaned.valid_encoding?
     # Some of it might be old Windows code page
     cleaned = attachment.encode( 'UTF-8', 'Windows-1252' )
   end
   attachment = cleaned
 rescue EncodingError
   # Force it to UTF-8, throwing out invalid bits
   attachment = attachment.force_encoding("ISO-8859-1").encode("utf-8", replace: nil)
 end



이 시도:

def to_utf8(str)
  str = str.force_encoding('UTF-8')
  return str if str.valid_encoding?
  str.encode("UTF-8", 'binary', invalid: :replace, undef: :replace, replace: '')
end



Related