문제

나는 이것을 많이 보았지만 우아한 해결책을 찾지 못했습니다.사용자 입력에 잘못된 바이트 시퀀스가 ​​포함된 경우 예외가 발생하지 않도록 할 수 있어야 합니다.예를 들어:

# @raw_response comes from user and contains invalid UTF-8
# for example: @raw_response = "\xBF"  
regex.match(@raw_response)
ArgumentError: invalid byte sequence in UTF-8

수많은 유사한 질문이 제기되었으며 결과는 문자열을 인코딩하거나 강제로 인코딩하는 것으로 보입니다.그러나 이들 중 어느 것도 나에게 적합하지 않습니다.

regex.match(@raw_response.force_encoding("UTF-8"))
ArgumentError: invalid byte sequence in UTF-8

또는

regex.match(@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?"))
ArgumentError: invalid byte sequence in UTF-8

이것은 Ruby 2.0.0의 버그인가요, 아니면 뭔가 빠졌나요?

이상한 점은 올바르게 인코딩된 것처럼 보이지만 일치 항목에서 계속해서 예외가 발생한다는 것입니다.

@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?").encoding
 => #<Encoding:UTF-8>
도움이 되었습니까?

해결책

루비 2.0에서는 encode 방법 문자열을 현재 인코딩으로 인코딩할 때 작동하지 않습니다.

인코딩에서의 변환에 유의하세요. enc 동일한 인코딩으로 enc 작동하지 않습니다.수신자는 변경 사항 없이 반환되며 잘못된 바이트가 있더라도 예외가 발생하지 않습니다.

이는 2.1에서 변경되었으며 scrub 방법 이를 수행하는 더 쉬운 방법입니다.

2.1로 업그레이드할 수 없는 경우 잘못된 바이트를 제거하려면 다음과 같이 다른 인코딩으로 인코딩해야 합니다.

if ! s.valid_encoding?
  s = s.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8')
end

다른 팁

레일이 있고 ruby뿐만 아니라 tidy_bytes를 사용할 수도 있습니다..이것은 Ruby 2.0과 함께 작동하며 대체 문자 대신에 현명한 데이터를 되돌릴 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top