Innehållsförteckning RecentChanges News ElispArea HowTo Problems Suggestions

FindingNonAsciiCharacters

Last edit

Sammanfattning: `unencodable-char-position' is now provided w/ Emacs 23.2

Deleted:

< A better implementation would use `unencodable-char-position',
< but that requires cvs-emacs:


Occasionally, you may have a big file which refuses to save as ASCII. Here is how to find the non-ASCII character.

The recommended way to search for non-ASCII characters is to use the regexp "[^\000-\177]". It is portable and efficient. (Interactively, use C-M-s [ ^ C-q 0 0 0 RET - C-q 1 7 7 RET ].) In Emacs 21 you could also use the char class [[:nonascii:]].

You can also use this function which takes advantage of the char-charset function. This probably only works in GnuEmacs, fixes for XEmacs welcome.

(defun find-first-non-ascii-char ()
  "Find the first non-ascii character from point onwards."
  (interactive)
  (let (point)
    (save-excursion
      (setq point
            (catch 'non-ascii
              (while (not (eobp))
                (or (eq (char-charset (following-char))
                        'ascii)
                    (throw 'non-ascii (point)))
                (forward-char 1)))))
    (if point
        (goto-char point)
        (message "No non-ascii characters."))))

Generalising the above - this function will allow you to find characters your current coding system cannot encode:

(defun find-next-unsafe-char (&optional coding-system)
  "Find the next character in the buffer that cannot be encoded by
coding-system. If coding-system is unspecified, default to the coding
system that would be used to save this buffer. With prefix argument,
prompt the user for a coding system."
  (interactive "Zcoding-system: ")
  (if (stringp coding-system) (setq coding-system (intern coding-system)))
  (if coding-system nil
    (setq coding-system
          (or save-buffer-coding-system buffer-file-coding-system)))
  (let ((found nil) (char nil) (csets nil) (safe nil))
    (setq safe (coding-system-get coding-system 'safe-chars))
    ;; some systems merely specify the charsets as ones they can encode:
    (setq csets (coding-system-get coding-system 'safe-charsets))
    (save-excursion
      ;;(message "zoom to <")
      (let ((end  (point-max))
            (here (point    ))
            (char  nil))
        (while (and (< here end) (not found))
          (setq char (char-after here))
          (if (or (eq safe t)
                  (< char ?\177)
                  (and safe  (aref safe char))
                  (and csets (memq (char-charset char) csets)))
              nil ;; safe char, noop
            (setq found (cons here char)))
          (setq here (1+ here))) ))
    (and found (goto-char (1+ (car found))))
    found))

Here’s a simple defun to show non-ascii characters of current buffer in an Occur buffer

(defun occur-non-ascii ()
  "Find any non-ascii characters in the current buffer."
  (interactive)
  (occur "[^[:ascii:]]"))

See also markchars-mode in nXhtml.


CategoryInternationalization