2014-02-08 1 views
1

누구든지이 코드를 어떻게 설명 할 수 있습니까? 루비에서Ruby에서 같은 문자열, 인코딩이 다르지만 같음

s1 = "\x20".force_encoding 'UTF-8' 
s2 = "\x20".force_encoding 'ASCII-8BIT' 
puts "s1 == s2: #{s1 == s2}" 

s3 = "\xAB".force_encoding 'UTF-8' 
s4 = "\xAB".force_encoding 'ASCII-8BIT' 
puts "s3 == s4: #{s3 == s4}" 

그것은 인쇄 2.0.0p353 :

s1 == s2: true 
s3 == s4: false 

나는 S1과 S2가 왜 S3과 S4 것은 동일하지 이해하지 않습니다. 0xAB은 '½'에 대한 ASCII 코드입니다. ASCII 코드는 ASCII-8BIT와 UTF8 모두에서 나타납니다. 인코딩 때문에

+0

을 '\ 0xAB'이기도 * UTF-8 문자 코드로''½ ''이 아닙니다. "\ xAB".force_encoding ('CP850'). encode ('UTF-8')'-'½'을줍니다. . . http://en.wikipedia.org/wiki/Code_page_850 - 아마도 다른 MSDOS 기반 확장 프로그램에도이 매핑이 있습니다. –

+0

나는 1/2에 대한 ASCII 코드라는 정보를 어디서 얻었는지 모르겠다. 그것은 실제로 [왼쪽을 가리키는 이중 각도 인용 부호, 왼쪽 가리키는 계략] (http://www.ascii-code.com/)입니다. '\ xBD'를 원하셨습니까? – roippi

+0

Thanks @ NeeSlater, 그건 의미가 있습니다! – johnrl

답변

3

\xAB\xAB 동일하지 않다 UTF-8가 멀티 바이트 세트로 부호화되고, \xff-\x80에서 문자가 \x80 위에 코드로 심볼을 인코딩하는 데 사용 .

그러나 ASCII-8BIT 이후

특정 인코딩 아니라, 에 따라 인코딩 클래스로서 취급 할 수 있고, 인코딩 별칭된다. \x80에서 \xff로 코드는 또한 인코딩 할 수 없습니다. 따라서 이것은 ASCII 기반 코드 페이지의 추상화와 같습니다. 당신이 UTF-8ASCII-8BIT 변환하려고하면

그래서, 당신은 변환 예외 얻을 것이다 : 그러나

Encoding::UndefinedConversionError: "\xC9" from ASCII-8BIT to UTF-8 

을, 당신은 8에서 제대로 기호를 처리 할 수 ​​있습니다 다음과 같이 명시 적으로 사용하는 비트 인코딩 또는 코드 페이지 및 숯 \xBD을 설정

"\xBD".force_encoding('ISO-8859-1').encode('UTF-8') 
# => "½" 
"\xBD".force_encoding('CP1252').encode('UTF-8') 
# => "½" 
관련 문제