Function: mm-find-mime-charset-region
mm-find-mime-charset-region is a byte-compiled function defined in
mm-util.el.gz.
Signature
(mm-find-mime-charset-region B E &optional HACK-CHARSETS)
Documentation
Return the MIME charsets needed to encode the region between B and E.
nil means ASCII, a single-element list represents an appropriate MIME charset, and a longer list means no appropriate charset.
Source Code
;; Defined in /usr/src/emacs/lisp/gnus/mm-util.el.gz
(defun mm-find-mime-charset-region (b e &optional hack-charsets)
"Return the MIME charsets needed to encode the region between B and E.
nil means ASCII, a single-element list represents an appropriate MIME
charset, and a longer list means no appropriate charset."
(let (charsets)
;; The return possibilities of this function are a mess...
(or (and enable-multibyte-characters
mm-use-find-coding-systems-region
;; Find the mime-charset of the most preferred coding
;; system that has one.
(let ((systems (find-coding-systems-region b e)))
(when mm-coding-system-priorities
(setq systems
(sort systems #'mm-sort-coding-systems-predicate)))
(setq systems (delq 'compound-text systems))
(unless (equal systems '(undecided))
(while systems
(let* ((head (pop systems))
(cs (or (coding-system-get head :mime-charset)
(coding-system-get head 'mime-charset))))
;; The mime-charset (`x-ctext') of
;; `compound-text' is not in the IANA list. We
;; shouldn't normally use anything here with a
;; mime-charset having an `x-' prefix.
;; Fixme: Allow this to be overridden, since
;; there is existing use of x-ctext.
;; Also people apparently need the coding system
;; `iso-2022-jp-3' (which Mule-UCS defines with
;; mime-charset, though it's not valid).
(if (and cs
(not (string-match "^[Xx]-" (symbol-name cs)))
;; UTF-16 of any variety is invalid for
;; text parts and, unfortunately, has
;; mime-charset defined both in Mule-UCS
;; and versions of Emacs. (The name
;; might be `mule-utf-16...' or
;; `utf-16...'.)
(not (string-match "utf-16" (symbol-name cs))))
(setq systems nil
charsets (list cs))))))
charsets))
;; We're not multibyte, or a single coding system won't cover it.
(setq charsets
(delete-dups
(mapcar #'mm-mime-charset
(delq 'ascii
(mm-find-charset-region b e))))))
(if (and (> (length charsets) 1)
(memq 'iso-8859-15 charsets)
(memq 'iso-8859-15 hack-charsets)
(save-excursion (mm-iso-8859-x-to-15-region b e)))
(dolist (x mm-iso-8859-15-compatible)
(setq charsets (delq (car x) charsets))))
(if (and (memq 'iso-2022-jp-2 charsets)
(memq 'iso-2022-jp-2 hack-charsets))
(setq charsets (delq 'iso-2022-jp charsets)))
charsets))