2

垂直タブ (別名 "^k") などのエスケープ文字を含む可能性のある特定のファイルを処理する必要があります。これにより、REPL (SBCL) や一部のライブラリ ( cxml-stpなど) が混乱します。

CL でこれらの文字をカバーする参照はありますか?どうすればそれらをフィルタリングできますか? emacs-lisp リファレンスを見つけたところですが、私が確認した限りでは、それらは一般的な Lisp では実際には機能しません。

4

3 に答える 3

2
(defun sanitize (string)
  (remove-if
   #'(lambda (x)
       (and (< x 32)
            (not (or (= x 13) (= x 10)))))
   string))

(with-output-to-string (s)
    (let ((sanitized 
          (sanitize
           (do ((a (make-array 100 :element-type '(unsigned-byte 8)))
                (i 0 (1+ i)))
               (nil)
             (when (= i (length a))
               (return a))
             (setf (aref a i) (random 64))))))
      (dotimes (i (length sanitized))
        (princ (code-char (aref sanitized i)) s))))

しかし、それはあなたのソース/あなたが正確にどの文字を含めたいかによって異なるかもしれません。これはASCIIで機能します-(mod 128)形式であることが保証されている場合。Unicodeははるかに複雑な質問です。ただし、これでもシェルスクリプトで特別な意味を持つ可能性のある文字は除外されますが、ソースがバイト単位である場合は解析する必要があるため、UTF-8などの形式でUnicode文字列を作成するのはお勧めできません。それを確認し、それらが有効なUTF形式であることを確認してください。また、Unicodeで可能な代替(冗長)表現、つまり発音区別符号と文字の組み合わせによって形成されるペアにも注意を払う必要があります。コードポイント範囲の空白領域など...

実を言うと、100%準拠したUnicode実装を備えたLispはまだ見たことがありません。それは思ったより難しいです、そしてあなたはおそらくそれのサブセットだけをとにかく必要とします。

これがUnicode文字列にとって良い考えではなかった実際的なケースが必要な場合-「ディレクトリ攻撃」とIIS5の脆弱性についてはグーグル。

于 2012-06-22T23:59:00.840 に答える
1

REMOVE-IF を使用する際の問題は、お気づきのように、探している文字に適切なハンドルがないことです。Hyperspec で「準標準文字」を検索すると、名前付き空白文字のリストがかなり短いことがわかります -- #\Newline, #\Space, #\Tab, #\Return, #\Page, #\Rubout, #\Backspace.

Emacs をエディターとして使用している場合、ターゲット値を見つけて切り取り、リテラルとしてコードに貼り付けることはそれほど難しくありませんが、それも良い考えではありません。一方、文字を見つけて REPL に貼り付けることができれば(char-name)、ala: を呼び出す方法を見つけることができるはずです(char-name (aref "<copy-paste-char>" 0))

より探索的であることを除けば、wvxvw が行っていることと同じようなことをします。ファイルをスキャンし、使用中のすべての文字を収集し、それらのコードと名前を出力するコードを記述します。(すべてを出力するだけではなく、ハッシュテーブルを使用して発生回数を数えます。つまり(incf (gethash <char> ht 0))、発生頻度を把握し、出力に圧倒されないようにします。)ファイルに不要な文字を特定して削除する方法を決定します。

于 2012-06-23T21:42:02.493 に答える
1

適切なテスト機能を備えた REMOVE-IF でうまくいくはずです。

于 2012-06-22T16:22:14.737 に答える