1
4

3 回答 3

4

我搜索了高低,但似乎 Emacs(或至少版本 24.3.1)没有这样的功能。我也无法在某个地方找到它。

基于我确实找到的类似(但不同)功能,我自己实现了它:

(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))))

我根本不是 Elisp 大师,但这行得通!

我还发现find-next-unsafe-char很有价值。

编辑:交互式版本!

(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 "á"string-to-char将其转换为(= 数字 225),并将number-to-string其转换为"225". 然后,concat连接"&#","225"";"得到"&#225;",替换原来的匹配。

C-x (用and将这些命令括起来C-x ),然后像往常一样应用C-x C-k nandM-x insert-kbd-macro来使用它们。


要查看以交互方式调用此函数的 elisp 等效项,请运行命令,然后按C-x M-:(重复复杂命令)。

不考虑活动区域的更简单的版本可能是:

(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 回答