[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#1174: 23.0.60; Some UTF-8 mails displaying wrongly in Emacs 23
From: |
Stefan Monnier |
Subject: |
bug#1174: 23.0.60; Some UTF-8 mails displaying wrongly in Emacs 23 |
Date: |
Tue, 02 Dec 2008 02:36:31 -0500 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux) |
> In Emacs 21 (which Gnus still aim to be compatible with), we have
> string-as-multibyte, but not string-to-multibyte. So your proposed
> code (i.e. mm-string-to-multibyte) runs
> (string-as-multibyte (char-to-string string))
> whereas we used to run
> (string-as-multibyte string)
> Does char-to-string matter here?
> (defalias 'mm-string-to-multibyte
> (cond
> ((featurep 'xemacs)
> 'identity)
> ((fboundp 'string-to-multibyte)
> 'string-to-multibyte)
> (t
> (lambda (string)
> "Return a multibyte string with the same individual chars as string."
> (mapconcat
> (lambda (ch) (mm-string-as-multibyte (char-to-string ch)))
> string "")))))
Oh, that's clever: yes, the mapconcat/char-to-string dance does make it
implement the string-to-multibyte behavior because doing the
string-as-multibyte conversion one byte at a time avoids the
problematic case. To quote myself from mm-util.el:
;; string-as-multibyte often doesn't really do what you think it does.
;; Example:
;; (aref (string-as-multibyte "\201") 0) -> 129 (aka ?\201)
;; (aref (string-as-multibyte "\300") 0) -> 192 (aka ?\300)
;; (aref (string-as-multibyte "\300\201") 0) -> 192 (aka ?\300)
;; (aref (string-as-multibyte "\300\201") 1) -> 129 (aka ?\201)
;; but
;; (aref (string-as-multibyte "\201\300") 0) -> 2240
;; (aref (string-as-multibyte "\201\300") 1) -> <error>
Basically when the sring passed is made of a single byte,
string-as-multibyte is equal to string-to-multibyte, which is the
property ued by the code you quoted above to build a poor man's
string-to-multibyte.
Stefan