给定一个字母(字符串),比如"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!
答案 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
您可能希望根据您的操作更改结果的编码。