2017-10-18 8 views
1

:UTF-8 문자열이 Ruby 2.0의 ASCII-8BIT 문자열과 같지 않은 이유는 무엇입니까? 내가 루비 2.3를 사용하고

나는 다음과 같은 문자열이 : 나는 그것을 포함하는 파일에 File.binread()"\xFF\xFE"

를, 그래서이 문자열의 인코딩이 ASCII-8BIT입니다. 그러나, 내 코드에서이 문자열을 리터럴 문자열 "\xFF\xFE" (모든 Ruby 문자열이 기본적으로 가지고있는 인코딩 UTF-8)과 비교하여 실제로 읽었는지 확인합니다.

그러나, 비교, false를 돌려 두 문자열이 동일한 바이트를 포함하더라도 - 그것은 단지 하나의 인코딩 ASCII-8BIT와 것을 어떻게 다른 하나는 UTF-8

이다 나는 두 가지 질문이있다 : (1) 왜 그것을 반환하지 않습니다 false? (2) 내가 원하는 것을 성취하는 가장 좋은 방법은 무엇입니까? 읽은 문자열이 일치하는지 확인하고 싶습니다 "\xFF\xFE"

+0

그냥 유니 코드의 파일을 읽고 싶다면 BOM을 사용하면 'BOM | UTF-8'의 [인코딩] (http://ruby-doc.org/core-2.4.2/IO.html#method-c-new-label-IO+Encoding)을 전달할 수 있습니다. '루비가 자동으로 처리하도록해라. – Stefan

답변

4

(1) 왜 false을 반환합니까?

문자열을 비교할 때 동일한 인코딩이 있거나 문자가 US-ASCII로 인코딩 가능해야합니다.

비교 문자열 만 바이트 값 0 (127)에 포함되어있는 경우 예상대로 작동 :

a = 'E'.encode('ISO8859-1') #=> "E" 
b = 'E'.encode('ISO8859-15') #=> "E" 

a.bytes #=> [69] 
b.bytes #=> [69] 
a == b #=> true 

(0b0xxxxxxx)

를 그리고 어떤 바이트 값이 포함 된 경우 실패 128-255 ( 0b1xxxxxxx)

a = 'É'.encode('ISO8859-1') #=> "\xC9" 
b = 'É'.encode('ISO8859-15') #=> "\xC9" 

a.bytes #=> [201] 
b.bytes #=> [201] 
a == b #=> false 

두 바이트가 모두 범위를 벗어나므로 문자열을 US-ASCII로 표시 할 수 없습니다.

"\xFF\xFE".bytes #=> [255, 254] 
이 의미있는 결과를 생성하지 않습니다 변환을 시도

10 : 다른 인코딩의 문자열 비교 될 때

"\xFF\xFE".encode('US-ASCII', 'ASCII-8BIT', :undef => :replace) 
#=> "??" 

문자열 그러므로 그 내용에 관계없이, false 반환합니다.

(2) 내가 원하는 것을 성취하는 가장 좋은 방법은 무엇입니까?

문자열을 동일한 인코딩으로 비교할 수 있습니다. binreadASCII-8BIT 인코딩 문자열을 반환합니다, 그래서 당신은 호환되는 1 만들 b을 사용할 수

IO.binread('your_file', 2) == "\xFF\xFE".b 

을하거나 비교할 수는 bytes :

IO.binread('your_file', 2).bytes == [0xFF, 0xFE] 
+0

하지만 8 비트 ASCII이며 문자 255와 254가 정의됩니다. 그래서 그게 뭐야? ' "\ xFF \ xFE".encode ('ASCII-8BIT')'는 정상적으로 작동합니다. 유효한 UTF-8이 아니기 때문입니까? – horseyguy

+3

"8 비트 ascii"같은 것은 없습니다. ASCII는 항상 존재하며 항상 7 비트입니다. –

+0

@ banister 당신은''ASCII-8BIT ''와''US-ASCII' '를 혼동하고 있습니다. 저의 답은 저의 대답이 정확하지 않았습니다. 그에 맞게 업데이트했습니다. – Stefan