将字母转换为相应的控制代码

时间:2015-01-17 14:14:57

标签: ruby control-characters

给定一个字母(字符串),比如"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!

2 个答案:

答案 0 :(得分:1)

你可以把它写成:

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

convert_to_control_code(97) # => "\u0001"
convert_to_control_code(98) # => "\u0002"

答案 1 :(得分:1)

一种可能性与Ruby itself does相同。它可能看起来像这样:

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

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