3 に答える
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))
私はあなたが探していると思いますiso-iso2sgml
正確に 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"
";"
"á"
これらのコマンドを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)))
";")))
(これは、プログラムで検索 + 置換を行うための推奨される方法を使用します。)