Uwe Schindler commented on XALANJ-2419:

Hi Jesper,
thanks! I applied the same patch like your's to my local checkout yesterday and 
I can confirm it fixes the XML case.

But it does not work for my HTML example above, the only workaround for the 
HTML encode is like it was here (if you pass an encoding of UTF-16 and use a 
writer to write it to an UTF-8 file - and you don't have a header with charset 
in HTML serializations).

The issue in ToHTML stream seems to be a counting problem (it looks like it 
print the whole surrogate correctly, but it forgot to increment the counter, so 
it prints a hex escape of the second part):
- I had no HREF attributes in my test, so i was not affected by a URL encoding 
corner case.
- Normal attributes seem to have the above input character counting problem, 
the astral character is written correctly, but the low surrogate is printed as 

> Astral characters written as a pair of NCRs with the surrogate scalar values 
> when using UTF-8
> ---------------------------------------------------------------------------------------------
>                 Key: XALANJ-2419
>                 URL: https://issues.apache.org/jira/browse/XALANJ-2419
>             Project: XalanJ2
>          Issue Type: Bug
>          Components: Serialization
>    Affects Versions: 2.7.1
>            Reporter: Henri Sivonen
>            Priority: Major
>         Attachments: XALANJ-2419-fix-v2.txt, XALANJ-2419-tests-v2.txt
> org.apache.xml.serializer.ToStream contains the following code:
>                     else if (m_encodingInfo.isInEncoding(ch)) {
>                         // If the character is in the encoding, and
>                         // not in the normal ASCII range, we also
>                         // just leave it get added on to the clean characters
>                     }
>                     else {
>                         // This is a fallback plan, we should never get here
>                         // but if the character wasn't previously handled
>                         // (i.e. isn't in the encoding, etc.) then what
>                         // should we do?  We choose to write out an entity
>                         writeOutCleanChars(chars, i, lastDirtyCharProcessed);
>                         writer.write("&#");
>                         writer.write(Integer.toString(ch));
>                         writer.write(';');
>                         lastDirtyCharProcessed = i;
>                     }
> This leads to the wrong (latter) if branch running for surrogates, because 
> isInEncoding() for UTF-8 returns false for surrogates. It is always wrong 
> (regardless of encoding) to escape a surrogate as an NCR.
> The practical effect of this bug is that any document with astral characters 
> in it ends up in an ill-formed serialization and does not parse back using an 
> XML parser.

This message was sent by Atlassian JIRA

To unsubscribe, e-mail: dev-unsubscr...@xalan.apache.org
For additional commands, e-mail: dev-h...@xalan.apache.org

Reply via email to