代码之家  ›  专栏  ›  技术社区  ›  RJHunter

在Ruby中chr()的反面是什么?

  •  92
  • RJHunter  · 技术社区  · 16 年前

    在许多语言中有一对函数, chr() ord() ,在数字和字符值之间转换。在某些语言中, () 被称为 asc() .

    露比有 Integer#chr 非常有效:

    >> 65.chr
    A
    

    够公平的。但是你怎么走另一条路呢?

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

    印刷品:

    65
    

    这和我想要的差不多。但我真的希望避免出现循环——我正在寻找一些足够短的内容,以便在声明 const .

    10 回复  |  直到 8 年前
        1
  •  75
  •   Rob Cameron    11 年前

    如果字符串“ORD”在1.9中不存在,则在2.0中存在:

    "A".ord #=> 65
    
        2
  •  33
  •   Robert Gamble    16 年前

    在Ruby 1.8系列之前(包括1.8系列)中,以下两个系列都将生成65个(用于ASCII):

    puts ?A
    'A'[0]
    

    Ruby1.9中的行为发生了变化,上面的两个行为都将生成“a”。在Ruby1.9中,正确的方法是:

    'A'[0].ord
    

    不幸的是, ord Ruby1.8中不存在方法。

        3
  •  13
  •   dylanfm    16 年前

    尝试:

    'A'.unpack('c')
    
        4
  •  10
  •   Martin Dorey    14 年前

    我想+1 Dylanfm和Ashelly的评论,但添加了[0]:

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

    unpack调用返回一个包含单个整数的数组,如果需要整数,则不总是接受该数组:

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

    我正在尝试编写在Ruby1.8.1、1.8.7和1.9.2上工作的代码。

    编辑为用大写字母将C传递给unpack,因为unpack(“c”)给了我-1,其中ord()给了我255(尽管运行在C的char被签名的平台上)。

        5
  •  3
  •   Kent Fredric    16 年前

    此外,如果字符串中有字符,并且希望在不使用循环的情况下对其进行解码:

    puts 'Az'[0]
    => 65
    puts 'Az'[1]
    => 122
    
        6
  •  3
  •   Barry    11 年前

    只是在通过RFC构建一个纯Ruby版本的StringPrep时遇到了这个问题。

    当心 chr 在[0255]之外失败,请使用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)>
    
        7
  •  2
  •   GregD    16 年前

    怎么样

    放?一

        8
  •  2
  •   Clark    11 年前

    如果不介意从数组中提取值,可以使用 "A".bytes

        9
  •  1
  •   Eduardo Santana MGA    11 年前

    您可以拥有这些:

    65.chr.ord
    'a'.ord.chr
    
        10
  •  0
  •   hantscolin    10 年前

    我正在为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