2011-10-28 21 views
2

我很欣賞關於如何將通過HTML文本框提供的ASCII控制字符轉換爲其十六進制或二進制表示形式的建議。如何操作控制字符?

目前,我的web應用程序,採用ASCII控制字符和轉換值,例如,如果^C進入返回5e43值表示「^」和「6」,而不是控制-C這在十六進制中表示爲02

我的想法是針對輸入運行正則表達式來檢查控制字符,例如:^[\w]{1},然後從預定義的表中返回與正則表達式匹配的值。

回答

5

您可以直接從(. *in* read)雖然人物如何讓你將是依賴於很多事情,最特別的是,瀏覽器很可能連你之前它們編碼爲HTTP傳輸的情況下閱讀開始。

我認爲,有那麼我想我會通過對幾個音符來處理的控制字符的所有組合是安全的終端代理:

  • 他們不是一個字符。您最多需要六個字符來表示它們。嘗試打Esc鍵 - 按Ctrl - ALT - 向左箭頭
  • ESC意味着Alt鍵ALT並不意味着ESC。如果第一個字符是esc那麼下一個字符是其字符值的meta/alt。所以如果你看到ESC - b這是Alt鍵 - b
  • 某些鍵(向上翻頁例如)自動發送ESC
  • esc - esc是它自己的東西(我不能說我完全理解)。

最好的方法是編寫一個小程序,每次從鍵盤讀取一個字符,然後開始磨碎鍵盤,看看你能想出什麼。

在這裏,我將在讀取一個字符兩次,打首次結束第二

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 - 結束

^[^[OF 
27 
27 
79 
70 
10 

而且CTRL人物大獎得主迄今ESC - 向右箭頭

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

取大獎的六個字節。