1
4

3 に答える 3

4

I searched high and low but it seems Emacs (or at least version 24.3.1) doesn't have such a function. Nor can I find it somewhere.

Based on a similar (but different) function I did find, I implemented it myself:

(require 'cl)
(defun html-nonascii-to-entities (string)
  "Replace any non-ascii characters with HTML (actually SGML) entity codes."
  (mapconcat
   #'(lambda (char)
       (case char
             (t (if (and (<= 8 char)
                         (<= char 126))
                    (char-to-string char)
                  (format "&#%02d;" char)))))
   string
   ""))
(defun html-nonascii-to-entities-region (region-begin region-end)
  "Replace any non-ascii characters with HTML (actually SGML) entity codes."
  (interactive "r")
  (save-excursion
    (let ((escaped (html-nonascii-to-entities (buffer-substring region-begin region-end))))
      (delete-region region-begin region-end)
      (goto-char region-begin)
      (insert escaped))))

I'm no Elisp guru at all, but this works!

I also found find-next-unsafe-char to be of value.

Edit: an interactive version!

(defun query-replace-nonascii-with-entities ()
  "Replace any non-ascii characters with HTML (actually SGML) entity codes."
  (interactive)
  (perform-replace "[^[:ascii:]]"
                   `((lambda (data count)
                       (format "&#%02d;" ; Hex: "&#x%x;"
                               (string-to-char (match-string 0)))))
                     t t nil))
于 2013-09-06T08:15:34.557 に答える
2

私はあなたが探していると思いますiso-iso2sgml

于 2013-09-06T09:41:08.670 に答える
2

正確に ASCII 文字セットを含む文字クラスがあります。その補数に一致する正規表現を使用して、ASCII 以外の文字の発生を見つけ、elisp を使用してそれらのコードに置き換えることができます。

M-x replace-regexp RET
[^[:ascii:]] RET
\,(concat "&#" (number-to-string (string-to-char \&)) ";") RET

したがって、たとえばáis が match: \&is"á"の場合、string-to-charそれを(= 数値 225) にnumber-to-string変換し、それを に変換し"225"ます。次に、とをconcat連結して を取得し、元の一致を置き換えます。"&#""225"";""&#225;"

これらのコマンドをC-x (とで囲み、通常どおりC-x )と を適用C-x C-k nして、それらから関数を作成します。M-x insert-kbd-macro


C-x M-:この関数を対話的に呼び出すのと同等の elisp を表示するには、コマンドを実行してから(Repeat complex command)を押します。

アクティブな領域を考慮しない、より単純なバージョンは次のようになります。

(while (re-search-forward "[^[:ascii:]]" nil t)
  (replace-match (concat "&#"
                         (number-to-string (string-to-char (match-string 0)))
                         ";")))

(これは、プログラムで検索 + 置換を行うための推奨される方法を使用します。)

于 2013-09-07T10:28:01.793 に答える