0

例如,给定一个字母(字符串),"a"我想将其转换为相应的控制代码,即"\ca"- 或等效地(以替代语法) - "\C-a", ?\ca, "\x01","\u0001"

我希望有一些“不错”、干净的方式来进行这种转换,但我想不通。

一个明显的第一次尝试可能是尝试类似的东西:

def convert_to_control_code(letter)
  "\c#{letter}"
end

...但这不起作用,因为它总是会返回"\u0003{letter}""\u0003"控制代码在哪里"\c#"

我目前的解决方案只是通过执行以下操作来“蛮力”它:

def convert_to_control_code(letter)
  (0..255).detect { |x| x.chr =~ Regexp.new("\\c#{char}") }.chr
end

但是,我不禁觉得有一种“正确”的方式来做到这一点!

编辑:

这是我想出的另一个非蛮力解决方案,它似乎有效:

def convert_to_control_code(letter)
  (letter.ord % 32).chr
end

这看起来好多了,但也很hacky!

4

2 回答 2

1

You can write it as :

def convert_to_control_code(letter)
  eval "?\\C-#{letter.chr}" 
end

convert_to_control_code(97) # => "\u0001"
convert_to_control_code(98) # => "\u0002"
于 2015-01-17T14:49:34.840 回答
1

一种可能性是像Ruby 本身那样做。它可能看起来像这样:

def convert_to_control(letter)
  letter = letter.chr # ensure we are only dealing with a single char
  return 0177.chr if letter == '?'
  raise 'an error' unless letter.ascii_only? # or do something else
  (letter.ord & 0x9f).chr
end

您可能希望根据您正在执行的操作更改结果的编码。

于 2015-01-17T16:59:48.440 回答