Function: mm-charset-to-coding-system
mm-charset-to-coding-system is a byte-compiled function defined in
mm-util.el.gz.
Signature
(mm-charset-to-coding-system CHARSET &optional LBT ALLOW-OVERRIDE SILENT)
Documentation
Return coding-system corresponding to CHARSET.
CHARSET is a symbol naming a MIME charset.
If optional argument LBT (unix, dos or mac) is specified, it is
used as the line break code type of the coding system.
If ALLOW-OVERRIDE is given, use mm-charset-override-alist to
map undesired charset names to their replacement. This should
only be used for decoding, not for encoding.
A non-nil value of SILENT means don't issue a warning even if CHARSET is not available.
Source Code
;; Defined in /usr/src/emacs/lisp/gnus/mm-util.el.gz
;; Note: this function has to be defined before `mm-charset-override-alist'
;; since it will use this function in order to determine its default value
;; when loading mm-util.elc.
(defun mm-charset-to-coding-system (charset &optional lbt
allow-override silent)
"Return coding-system corresponding to CHARSET.
CHARSET is a symbol naming a MIME charset.
If optional argument LBT (`unix', `dos' or `mac') is specified, it is
used as the line break code type of the coding system.
If ALLOW-OVERRIDE is given, use `mm-charset-override-alist' to
map undesired charset names to their replacement. This should
only be used for decoding, not for encoding.
A non-nil value of SILENT means don't issue a warning even if CHARSET
is not available."
;; OVERRIDE is used (only) in `mm-decode-body' and `mm-decode-string'.
(when (stringp charset)
(setq charset (intern (downcase charset))))
(when lbt
(setq charset (intern (format "%s-%s" charset lbt))))
(cond
((null charset)
charset)
;; Check override list quite early. Should only used for decoding, not for
;; encoding!
((and allow-override
(let ((cs (cdr (assq charset mm-charset-override-alist))))
(and cs (mm-coding-system-p cs) cs))))
;; ascii
((or (eq charset 'us-ascii)
(string-match "ansi.x3.4" (symbol-name charset)))
'ascii)
;; Check to see whether we can handle this charset. (This depends
;; on there being some coding system matching each `mime-charset'
;; property defined, as there should be.)
((and (mm-coding-system-p charset)
;; Doing this would potentially weed out incorrect charsets.
;; charset
;; (eq charset (coding-system-get charset 'mime-charset))
)
charset)
;; Use coding system Emacs knows.
((and (fboundp 'coding-system-from-name)
(coding-system-from-name charset)))
;; Eval expressions from `mm-charset-eval-alist'
((let* ((el (assq charset mm-charset-eval-alist))
(cs (car el))
(form (cdr el)))
(and cs
form
(prog2
;; Avoid errors...
(condition-case nil (eval form t) (error nil))
;; (message "Failed to eval `%s'" form))
(mm-coding-system-p cs)
(message "Added charset `%s' via `mm-charset-eval-alist'" cs))
cs)))
;; Translate invalid charsets.
((let ((cs (cdr (assq charset mm-charset-synonym-alist))))
(and cs
(mm-coding-system-p cs)
;; (message
;; "Using synonym `%s' from `mm-charset-synonym-alist' for `%s'"
;; cs charset)
cs)))
;; Last resort: search the coding system list for entries which
;; have the right mime-charset in case the canonical name isn't
;; defined (though it should be).
((let (cs)
;; mm-get-coding-system-list returns a list of cs without lbt.
;; Do we need -lbt?
(dolist (c (mm-get-coding-system-list))
(if (and (null cs)
(eq charset (or (coding-system-get c :mime-charset)
(coding-system-get c 'mime-charset))))
(setq cs c)))
(unless (or silent cs)
;; Warn the user about unknown charset:
(if (fboundp 'gnus-message)
(gnus-message 7 "Unknown charset: %s" charset)
(message "Unknown charset: %s" charset)))
cs))))