簡體   English   中英

用Emacs將非ASCII字符替換為SGML實體代碼

[英]Replace non-ASCII characters with SGML entity codes with Emacs

我有一個HTML文件,其中包含一些非ASCII字符,例如用UTF-8或UTF-16編碼。 為了將文件保存為ASCII,我想用其(SGML / HTML / XML)實體代碼替換它們。 因此,例如,每個ë都應變為ë 每個都應變成◊ 我怎么做?

我使用Emacs作為編輯器。 我確定它具有執行替換的功能,但是我找不到它。 我想念什么? 還是我自己實現它?

我上下搜索,但似乎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))

我認為您正在尋找iso-iso2sgml

有一個字符類 ,其中恰好包含ASCII字符集。 您可以使用與其補語匹配的正則表達式來查找非ASCII字符的出現,然后使用elisp將其替換為其代碼:

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

因此,例如,當á匹配時: \\&"á"string-to-char將其轉換為 (= 225), number-to-string將其轉換為"225" 然后, concat連接"&#""225"";" 得到"&#225;" ,它將替換原始匹配項。

Cx (Cx )包圍這些命令,並像往常一樣應用Cx Ck nMx insert-kbd-macro來使它們發揮作用。


要查看以交互方式調用此函數的方式,請運行命令,然后按Cx M-:重復復雜命令)。

一個不考慮活動區域的簡單版本可能是:

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

(這使用推薦的方式以編程方式進行搜索和替換。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM