Skip to content

cssSelector doesn't handle combining characters correctly #1984

Closed

Description

@samshutchins
    @Test
    void combiningCharactersInIdentifier()
    {
        final String html = """
            <html>
            <head>
            <meta charset="utf-8">
            </head>
                        
            <body>
            <img class="e\u0301" src="/corner.jpg">
            </body>
                        
            </html>""";

        final Document document = Jsoup.parse(html);
        final Elements images = document.getElementsByTag("img");

        final Element img = images.get(0);
        final String cssSelector = img.cssSelector();

        assertEquals("html > body > img.e\u0301", cssSelector);
    }

The example above uses combining characters to create an é. Emoji make heavy use of combining characters (👨‍👨‍👧‍👧 is made up of 11 characters: \uD83D\uDC68\u200D\uD83D\uDC68\u200D\uD83D\uDC67\u200D\uD83D\uDC67).

I have seen emoji used as css class names in the wild, and I think the character escaping code is doing the wrong thing when calling cssSelector, it looks like it's escaping every character individually, which breaks things with these combining characters.

Activity

  1. changed the title [-]`cssSelector` doesn't handle combinding characters correctly[/-] [+]`cssSelector` doesn't handle combining characters correctly[/+] on Aug 4, 2023
  2. jhy commented on Oct 20, 2023

    @jhy
    Owner

    Current jsoup: html > body > img.e\́
    Chrome: body > p.e\\u0301

    I don't think it's incorrect to emit it as a run of characters. And the selector does work in jsoup. We could improve to escape the combining form as a \u escape character, like Chrome is.

  3. added
    fixedAn {bug|improvement} that has been {fixed|implemented}
    on Apr 22, 2025
  4. added this to the 1.20.1 milestone on Apr 22, 2025
  5. added a commit that references this issue on Apr 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    fixedAn {bug|improvement} that has been {fixed|implemented}

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions