Ruby 2.0.0 String#Match 인수 오류:UTF-8의 잘못된 바이트 시퀀스
-
21-12-2019 - |
문제
나는 이것을 많이 보았지만 우아한 해결책을 찾지 못했습니다.사용자 입력에 잘못된 바이트 시퀀스가 포함된 경우 예외가 발생하지 않도록 할 수 있어야 합니다.예를 들어:
# @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과 함께 작동하며 대체 문자 대신에 현명한 데이터를 되돌릴 것입니다.
제휴하지 않습니다 StackOverflow