如何操纵控制字符?

Ari*_*Ari 2 clojure

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

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

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

Art*_*ldt 5

您可以直接从阅读使用(. *in* read),虽然人物如何让你将是依赖于很多事情,最特别的是,浏览器很可能会对其编码,以便HTTP传输,你甚至开始之前的情况.

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

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

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

下面笔者就从读取一个字符两次和命中home的第一次和end第二

clojure.core=> (. *in* read)
10
clojure.core=> (. *in* read)
10
Run Code Online (Sandbox Code Playgroud)

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

下面的例子将不会在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)))))
Run Code Online (Sandbox Code Playgroud)

运行它并点击这两个键会产生以下结果:

^[OF
27
79
70
10      <-- this is the newline
^[OH
27      <-- esc start marker look for this
79
72
10      <-- this is the newline
Run Code Online (Sandbox Code Playgroud)

这是esc-end

^[^[OF
27
27
79
70
10
Run Code Online (Sandbox Code Playgroud)

ctrl这样性格大奖得主远esc-right-arrow

^[[1;5C
27
91
49
59
53
67
10
Run Code Online (Sandbox Code Playgroud)

获得六个字节的奖金.