Clojure 如何操作控制字符?
对于如何将通过HTML文本框提供的ASCII控制字符转换为十六进制或二进制表示形式的建议,我将不胜感激 目前,我的web应用程序采用ASCII控制字符串并转换值,例如,如果输入了Clojure 如何操作控制字符?,clojure,Clojure,对于如何将通过HTML文本框提供的ASCII控制字符转换为十六进制或二进制表示形式的建议,我将不胜感激 目前,我的web应用程序采用ASCII控制字符串并转换值,例如,如果输入了^C,则返回值5e43,表示“^”和“6”,而不是control-C,用十六进制表示02 我的想法是对输入运行一个正则表达式,以检查控制字符,例如:^[\w]{1},然后从与正则表达式匹配的预定义表中返回值。您可以使用(.*in*read)直接从中读取字符,尽管字符的获取方式取决于很多事情,最具体的情况是,在您开始之前,
^C
,则返回值5e43
,表示“^”和“6”,而不是control-C,用十六进制表示02
我的想法是对输入运行一个正则表达式,以检查控制字符,例如:
^[\w]{1}
,然后从与正则表达式匹配的预定义表中返回值。您可以使用(.*in*read)
直接从中读取字符,尽管字符的获取方式取决于很多事情,最具体的情况是,在您开始之前,浏览器可能会为http传输对它们进行编码
我维护了一个安全的终端代理,该代理必须处理所有控制字符的组合,因此我想我要传达一些注意事项:
- 它们不是一个字符长。最多需要六个字符来表示它们。尝试按Esc Ctrl alt左箭头
- esc表示Alt,但Alt不表示esc。如果第一个字符是esc,则下一个字符是其字符值的meta/alt。如果你看到esc-b,这是Alt-b
- 某些键(例如翻页)会自动发送esc李>
- esc是它自己的东西(我不能说我完全理解)
clojure.core=> (. *in* read)
10
clojure.core=> (. *in* read)
10
很明显,一个字符不足以区分这两个键,两个字符如何
下一个示例不会在repl中运行,因为repl尝试为您“处理”控制字符,所以您必须创建一个新项目lein new esc
添加此代码,然后lein uberjar
和java-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
和ctrl字符大奖得主迄今为止esc右箭头
以6字节的速度获奖
^[^[OF
27
27
79
70
10
^[[1;5C
27
91
49
59
53
67
10