문제

많은 언어에는 한 쌍의 기능이 있습니다. 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top