如何操纵控制字符?

时间:2011-10-28 16:20:37

标签: clojure

我很欣赏有关如何将ASCII控制字符(通过HTML文本框提供)转换为十六进制或二进制表示的建议。

目前,我的网络应用程序采用ASCII控制字符 string 并转换值,例如,如果输入^C,则返回值5e43,表示“ ^“和”6“,不是control-c,以十六进制表示为02

我的想法是对输入运行正则表达式以检查控件字符,例如:^[\w]{1},然后从与正则表达式匹配的预定义表中返回值。

1 个答案:

答案 0 :(得分:5)

您可以使用(. *in* read)直接从 中读取,但字符对您的影响将取决于很多事情,特别是浏览器可能会出现的情况在开始之前将它们编码为http传输。

我维护一个安全的终端代理,必须处理控制字符的所有组合,所以我想我会传递一些注意事项:

  • 他们不是一个字符长。你需要最多六个字符来代表它们。尝试按 Esc - Ctrl - alt - 左箭头
  • esc 暗示 Alt alt 并不暗示 esc 。如果第一个字符是 esc ,则下一个字符是其字符值的 meta / alt 。所以如果你看到 esc - b ,这是 Alt - b
  • 某些键(例如 page up )会自动发送 esc
  • esc - esc 这是它自己的事情(我不能说我完全理解)。

最好的方法是编写一个小程序,一次从键盘读取一个字符,然后开始捣碎键盘,看看你能想出什么。

在这里,我将从 中读取一个角色,第一次点击 home 结束第二次

clojure.core=> (. *in* read)
10
clojure.core=> (. *in* read)
10

很明显,一个字符不足以区分这两个字符,两个字符怎么样?

下一个示例将不会在repl中运行,因为repl会尝试为您“处理”控制字符,因此您必须创建一个新项目lein new esc然后添加此代码lein uberjarjava -jar esc-1.0.0-SNAPSHOT-standalone.jar

(ns esc.core
  (:gen-class))

(defn -main []
  (dorun (repeatedly #(println (. *in* read)))))

运行它并点击这两个键就产生了这个:

^[OF
27
79
70
10      <-- this is the newline
^[OH
27      <-- esc start marker look for this
79
72
10      <-- this is the newline

这是 esc - end

^[^[OF
27
27
79
70
10

到目前为止 ctrl 角色大奖得主 esc - 右箭头

^[[1;5C
27
91
49
59
53
67
10

以6个字节获得奖金。