2017-11-17 16 views
0

open()을 사용하여 임의의 서버에서 파일을 가져 오려고합니다. 서버는 파일에 대한 Content-Type을 지정할 수 있습니다. text/calendar; charset=utf-8 또는 text/calendar; charset=ISO-8859-1입니다.이 경우 open()은 서버가 주장하는대로 charset이 있다고 믿습니다. 그러나 서버가 charset을 지정하지 않으면 open()은 charset이 "ASCII-8BIT"라고 가정합니다. 대신 text/calendar (즉, "iCal 파일")은 "UTF-8"로 인코딩되어야하므로 open()은 문자 세트가 "UTF-8"(문자 세트가 지정되지 않은 경우)이라고 가정합니다.open-uri를 사용하여 기본 문자 집합을 지정하지만 서버 제공 문자셋을 사용하는 경우

charset이 지정되어 있지 않은 경우에만 문자를 사용한다고 가정합니다. 왜냐하면 나는 문자셋이 무엇이든지간에 파일을 선택적으로 제공하기 위해 서버의 결정을 존중하고 싶기 때문입니다..

open('http://my-test-uri.test', 'r:UTF-8')을 시도했지만, 서버가 "ISO-8859-1"과 같은 다른 문자 집합을 지정하더라도 무조건 charset을 무시합니다.

답변

0

OpenURI::Meta#charset은 서버가 문자 세트를 지정하지 않은 경우에만 문자 세트를 리턴하는 블록을 허용합니다.

이 정보를 사용하여, 우리는 하나를 인코딩 동일 (중복)했다에 open에 의해 반환 된 StringIO의 인코딩을 설정하거나 기본값으로 할 수 있습니다

open('http://localhost:3333').tap do |io| 
    charset = io.charset { 'utf-8' } 
    io.set_encoding(charset) 
end