Ruby에서 chr ()의 반대는 무엇입니까?


100

많은 언어에는 숫자와 문자 값 사이를 변환하는 함수 chr()및 의 쌍이 ord()있습니다. 일부 언어 ord()라고합니다 asc().

Ruby에는 Integer#chr, 이는 훌륭하게 작동합니다.

>> 65.chr
A

그럴 수 있지. 하지만 어떻게 다른 길로 가나 요?

"A".each_byte do |byte|
   puts byte
end

인쇄물:

65

그리고 그것은 내가 원하는 것에 매우 가깝습니다. 하지만 나는 루프를 피하는 편이 낫다 const. .NET을 선언 할 때 읽을 수있을만큼 짧은 것을 찾고있다 .

답변:


84

String # ord가 1.9에 존재하지 않았다면 2.0에 존재합니다.

"A".ord #=> 65

33

1.8 시리즈까지의 Ruby에서 다음은 모두 65 (ASCII의 경우)를 생성합니다.

puts ?A
'A'[0]

Ruby 1.9에서 동작이 변경되었으며, 위의 두 가지 모두 대신 "A"를 생성합니다. Ruby 1.9에서이를 수행하는 올바른 방법은 다음과 같습니다.

'A'[0].ord

불행히도이 ord메서드는 Ruby 1.8에 없습니다.


루비 1.9의 "올바른"방법이 너무 길다는 것은 안타깝지만 적어도 "ord"를 검색 할 때 더 쉽게 표시 될 것입니다. 매우 상세한 답변에 감사드립니다.
RJHunter

13

시험:

'A'.unpack('c')

1
이제 Ruby 1.9가 'A'[0]의 의미를 변경 했으므로 더 이식 가능한 방법입니다.
AShelly

10

dylanfm 및 AShelly의 댓글을 +1하고 싶지만 [0]을 추가합니다.

'A'.unpack('C')[0]

unpack 호출은 단일 정수를 포함하는 Array를 반환하며, 정수가 필요한 경우 항상 허용되지는 않습니다.

$ 루비 -e 'printf ( "0x % 02X \ n", "A".unpack ( "C"))'
-e : 1 : in`printf ': 배열을 정수로 변환 할 수 없습니다 (TypeError).
    -e : 1에서
$ 루비 -e 'printf ( "0x % 02X \ n", "A".unpack ( "C") [0])'
0x41
$ 

Ruby 1.8.1, 1.8.7 및 1.9.2에서 작동하는 코드를 작성하려고합니다.

unpack ( "c")는 나에게 -1을 제공하고 ord ()는 나에게 255를 제공하기 때문에 C를 전달하여 대문자로 풀도록 편집했습니다 (C의 문자가 서명 된 플랫폼에서 실행 중임에도 불구하고).


4

RFC를 통해 Stringprep의 순수한 Ruby 버전을 모으는 동안 이것을 발견했습니다.

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)>

감사합니다,이 유일한주는 해답이 될 것으로 보인다 char정확하고 유니 코드의 경우는 역
Munyari

3

또한 문자열에 문자가 있고 루프없이 디코딩하려는 경우 :

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122



2

배열에서 값을 가져와도 괜찮다면 다음을 사용할 수 있습니다. "A".bytes


0

1.8.6 및 1.9.3에 대한 코드를 작성 중이며 두 환경 모두에서 작동하는 이러한 솔루션을 얻을 수 없습니다.

그러나 다른 솔루션을 발견했습니다. http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

그것은 나에게도 효과가 없었지만 내 용도에 맞게 조정했습니다.

unless "".respond_to?(:ord)
  class Fixnum
    def ord
      return self
    end
  end
end

그렇게하면 다음이 두 환경에서 모두 작동합니다.

'A'[0].ord


user18096이 답을 썼을 때 "A".unpack("C")[0]Ruby 1.8.1, Ruby 1.8.7 및 Ruby 1.9.2를 대상으로했습니다. 귀하의 환경에서 실패합니까? 어떤 종류의 실패?
RJHunter 2015

안녕하세요 RJHunter, 문자열의 특정 문자를 숫자 값으로 변환하려고합니다. 다음 코드는 1.9.3에서는 작동하지만 1.8.6에서는 작동하지 않습니다. self.status = tagAccountString[4].unpack('C')[0] 1.8.6에서 I get Exception undefined method unpack 'for 0 : Fixnum processing main buffered tag data-exit` 다음 코드는 두 환경 모두에서 (제안 된 솔루션과 함께) 작동합니다. self.status = tagAccountString[4].ord 모든 조언 (예 : 더 나은 솔루션)을 환영합니다
hantscolin

tagAccountString[4]최신 Rubies에서는 문자열을 반환하지만 Ruby 1.8에서는 Fixnum을 반환하는 데 사용됩니다. 이것이 오류를 본 이유 undefined method unpack for 0:Fixnum입니다. 항상 네 문자를 무시하고 다음 문자를 변환하려는 경우 status = tagAccountString[4,1].unpack('C')[0]에도 사용할 수 있습니다 status, = tagAccountString.unpack('xxxxC').
RJHunter

설명 및 대체 솔루션에 대해 RJHunter에게 감사드립니다. "내"솔루션은 읽기 쉽고 재사용으로 (좋은 이유가 너무가없는?)하지만, 그 맡기 겠소
hantscolin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.