Function: xselect--encode-string
xselect--encode-string is a byte-compiled function defined in
select.el.gz.
Signature
(xselect--encode-string TYPE STR &optional CAN-MODIFY PREFER-STRING-TO-C-STRING)
Source Code
;; Defined in /usr/src/emacs/lisp/select.el.gz
(defun xselect--encode-string (type str &optional can-modify
prefer-string-to-c-string)
(when str
;; If TYPE is nil, this is a local request; return STR as-is.
(if (null type)
str
;; Otherwise, encode STR.
(let ((coding (or next-selection-coding-system
selection-coding-system)))
(if coding
(setq coding (coding-system-base coding)))
(let ((inhibit-read-only t))
;; Suppress producing escape sequences for compositions.
;; But avoid modifying the string if it's a buffer name etc.
(unless can-modify (setq str (substring str 0)))
(remove-text-properties 0 (length str) '(composition nil) str)
;; For X selections, TEXT is a polymorphic target; choose
;; the actual type from `UTF8_STRING', `COMPOUND_TEXT',
;; `STRING', and `C_STRING'. On Nextstep, always use UTF-8
;; (see ns_string_to_pasteboard_internal in nsselect.m).
(when (eq type 'TEXT)
(cond
((featurep 'ns)
(setq type 'UTF8_STRING))
((not (multibyte-string-p str))
(setq type 'C_STRING))
(t
(let (non-latin-1 non-unicode eight-bit)
(mapc (lambda (x)
(if (>= x #x100)
(if (< x #x110000)
(setq non-latin-1 t)
(if (< x #x3FFF80)
(setq non-unicode t)
(setq eight-bit t)))))
str)
(setq type (if (or non-unicode
(and
non-latin-1
;; If a coding is specified for
;; selection, and that is
;; compatible with COMPOUND_TEXT,
;; use it.
coding
(eq (coding-system-get coding :mime-charset)
'x-ctext)))
'COMPOUND_TEXT
(if non-latin-1 'UTF8_STRING
(if eight-bit 'C_STRING
'STRING))))))))
(cond
((or (eq type 'UTF8_STRING)
(eq type 'text/plain\;charset=utf-8))
(if (or (not coding)
(not (eq (coding-system-type coding) 'utf-8)))
(setq coding 'utf-8))
(setq str (encode-coding-string str coding)))
((eq type 'STRING)
(if (or (not coding)
(not (eq (coding-system-type coding) 'charset)))
(setq coding 'iso-8859-1))
(setq str (encode-coding-string str coding)))
((eq type 'text/plain)
(if (or (not coding)
(not (eq (coding-system-type coding) 'charset)))
(setq coding 'ascii))
(setq str (encode-coding-string str coding)))
((eq type 'COMPOUND_TEXT)
(if (or (not coding)
(not (eq (coding-system-type coding) 'iso-2022)))
(setq coding 'compound-text-with-extensions))
(setq str (encode-coding-string str coding)))
((eq type 'C_STRING)
;; According to ICCCM Protocol v2.0 (para 2.7.1), C_STRING
;; is a zero-terminated sequence of raw bytes that
;; shouldn't be interpreted as text in any encoding.
;; Therefore, if STR is unibyte (the normal case), we use
;; it as-is; otherwise we assume some of the characters
;; are eight-bit and ensure they are converted to their
;; single-byte representation.
(or (null (multibyte-string-p str))
(setq str (encode-coding-string str 'raw-text-unix))))
(t
(error "Unknown selection type: %S" type)))))
;; Most programs are unable to handle NUL bytes in strings.
(setq str (string-replace "\0" "\\0" str))
(setq next-selection-coding-system nil)
(cons (if (and prefer-string-to-c-string
(eq type 'C_STRING))
'STRING type)
str))))