On 15 Sep 2009, at 03:03, Ian Hickson wrote:
[...] [R]egardless of the environment, �� and
𐀀 are not the
same -- the first has two invalid characters U+D800 and U+DC00, the
second
has one character U+10000.
That works well as long as the concepts are couched in abstract terms,
but how is one expected to prevent adjacent surrogates from coalescing
in a UTF-16 environment?
Firefox circumvents the problem by substituting U+FFFD for the
surrogates; other browsers make no attempt to prevent coalescence.
I'm not really sure how to make that clearer in the spec.
(Let us first determine what should happen.)
I suppose we
could just change the spec and say that surrogate characters (whether
literal characters, e.g. in UTF-8, or from character references) all
get
converted to U+FFFD?.
That seems to be the only reasonable option if handling
�� as U+FFFD U+FFFD is deemed desirable and sufficiently
compatible with existing documents. It would simplify things a bit in
non-UTF-16 environments (as compared to my interpretation of the
current text) without much added complexity in UTF-16 environments.
[\xD800�] should give U+FFFD U+DC00. It's not clear to me why
that is not clear. :-)
Could you walk me through the spec interpreting it in such a way
that you
get any other result?
See below.
The spec says "Bytes or sequences of bytes in the original byte stream
that could not be converted to Unicode characters must be converted to
U+FFFD REPLACEMENT CHARACTER code points".
I take it you mean that \xD800� should turn into \xFFFD�
at this point, which is only supported by the quoted text if "bytes or
sequences of bytes" representing surrogates "[cannot] be converted to
Unicode characters" or, to put it differently, if surrogates are not
"Unicode characters".
Unfortunately for this reading, the term "Unicode character" does not
seem to be defined in HTML5 or in Unicode, and the following paragraph
(which appears shortly after the one you quoted) clearly includes
surrogate code points within the concept of "Unicode character":
"Any occurrences of any characters in the ranges [...] U+D800 to U
+DFFF, [...] are parse errors. (These are all control characters or
permanently undefined Unicode characters.)"
Moreover, this paragraph would be pointless if the characters
mentioned therein could never occur at all.
***
The use of "Unicode character" without a definition is fine in other
parts of HTML5, but clearly not sufficiently precise in this instance.
If you want to exclude (unpaired) surrogate code points only, the
appropriate term to use would probably be "Unicode scalar value".
--
Øistein E. Andersen