문제
많은 언어에는 한 쌍의 기능이 있습니다. chr()
그리고 ord()
, 숫자와 문자 값을 변환하는 것. 일부 언어에서는 ord()
호출됩니다 asc()
.
루비가 있습니다 Integer#chr
, 훌륭하게 작동합니다 :
>> 65.chr
A
그럴 수 있지. 하지만 어떻게 다른 방향으로 가나 요?
"A".each_byte do |byte|
puts byte
end
인쇄물:
65
그리고 그것은 내가 원하는 것에 매우 가깝습니다. 그러나 나는 정말로 루프를 피할 것입니다. 나는 const
.
해결책
String#ord가 1.9에 존재하지 않으면 2.0에서 다음과 같습니다.
"A".ord #=> 65
다른 팁
1.8 시리즈까지 Ruby에서 다음은 65를 생산합니다 (ASCII 용).
puts ?A
'A'[0]
Ruby 1.9에서 동작이 바뀌었고, 위의 두 가지 모두 대신 "A"를 생산할 것입니다. 루비 1.9에서이를 수행하는 올바른 방법은 다음과 같습니다.
'A'[0].ord
불행히도, ord
루비 1.8에는 메소드가 존재하지 않습니다.
노력하다:
'A'.unpack('c')
+1 Dylanfm과 Ashelly의 의견을 원하지만 [0]를 추가합니다.
'A'.unpack('C')[0]
포장 콜은 단일 정수가 포함 된 배열을 반환하며, 이는 정수가 원하는 곳에 항상 허용되지는 않습니다.
$ ruby -e 'printf("0x%02X\n", "A".unpack("C"))' -e:1:in `printf': can't convert Array into Integer (TypeError) from -e:1 $ ruby -e 'printf("0x%02X\n", "A".unpack("C")[0])' 0x41 $
루비 1.8.1, 1.8.7 및 1.9.2에서 작동하는 코드를 작성하려고합니다.
포장 풀기 ( "C")는 ord ()가 255 (C의 숯이 서명 된 플랫폼에서 실행됨에도 불구하고)를 제공하기 때문에 대문자를 풀기 위해 C를 전달하도록 편집했습니다.
RFC를 통해 순수한 루비 버전의 StringPrep 버전을 만들면서 이것을 발견했습니다.
조심하십시오 chr
0,255] 외부에서 실패하고 대신 1.9.x -2.1.x 휴대용 교체를 사용하십시오.
[22] pry(main)> "\u0221".ord.chr
RangeError: 545 out of char range
from (pry):2:in 'chr'
[23] pry(main)> x = "\u0221".unpack('U')[0]
=> 545
[24] pry(main)> [x].pack('U')
=> "ȡ"
[25] pry(main)>
또한 문자열에 숯이 있고 루프없이 해독하려는 경우 :
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
어때
넣어? a
배열에서 값을 꺼내는 것이 마음에 들지 않으면 사용할 수 있습니다. "A".bytes
당신은 이것을 가질 수 있습니다 :
65.chr.ord
'a'.ord.chr
나는 1.8.6과 1.9.3에 대한 코드를 작성하고 있으며 두 환경 모두 에서이 솔루션을 얻을 수 없었습니다.
그러나 나는 또 다른 해결책을 발견했다.http://smajnr.net/2009/12/ruby-1-8-1omethoderror-undefined-method-for-string.html
그것은 나에게도 효과가 없었지만 나는 그것을 사용하기 위해 그것을 조정했다.
unless "".respond_to?(:ord)
class Fixnum
def ord
return self
end
end
end
그렇게 한 후 다음은 두 환경 모두에서 작동합니다.
'A'[0].ord