diff --git a/.changeset/new-kangaroos-double.md b/.changeset/new-kangaroos-double.md
new file mode 100644
index 000000000000..9f4cce7d31a8
--- /dev/null
+++ b/.changeset/new-kangaroos-double.md
@@ -0,0 +1,5 @@
+---
+'@sveltejs/kit': patch
+---
+
+Handle hash links with non-ASCII characters when prerendering
diff --git a/packages/kit/src/core/prerender/fixtures/ids/input.html b/packages/kit/src/core/prerender/fixtures/ids/input.html
index 50b212046685..cd6a0b43f169 100644
--- a/packages/kit/src/core/prerender/fixtures/ids/input.html
+++ b/packages/kit/src/core/prerender/fixtures/ids/input.html
@@ -1,3 +1,6 @@
before
backslash
-after
\ No newline at end of file
+after
+
diff --git a/packages/kit/src/core/prerender/fixtures/ids/output.json b/packages/kit/src/core/prerender/fixtures/ids/output.json
index ce83978a7a16..1ad4d8f3f78a 100644
--- a/packages/kit/src/core/prerender/fixtures/ids/output.json
+++ b/packages/kit/src/core/prerender/fixtures/ids/output.json
@@ -1,4 +1,4 @@
{
- "hrefs": [],
- "ids": ["before", "after"]
+ "hrefs": ["#encöded"],
+ "ids": ["before", "after", "encöded"]
}
diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js
index aa11d36af988..ec6a224182dd 100644
--- a/packages/kit/src/core/prerender/prerender.js
+++ b/packages/kit/src/core/prerender/prerender.js
@@ -137,7 +137,7 @@ export async function prerender() {
config.prerender.handleMissingId,
({ path, id, referrers }) => {
return (
- `The following pages contain links to ${path}#${id}, but no element with id="${id}" exists on ${path}:` +
+ `The following pages contain links to ${path}#${id}, but no element with id="${id}" exists on ${path} - see the \`handleMissingId\` option in https://kit.svelte.dev/docs/configuration#prerender for more info:` +
referrers.map((l) => `\n - ${l}`).join('')
);
}
@@ -262,11 +262,13 @@ export async function prerender() {
}
if (hash) {
- if (!expected_hashlinks.has(pathname + hash)) {
- expected_hashlinks.set(pathname + hash, new Set());
+ const key = decodeURI(pathname + hash);
+
+ if (!expected_hashlinks.has(key)) {
+ expected_hashlinks.set(key, new Set());
}
- /** @type {Set} */ (expected_hashlinks.get(pathname + hash)).add(decoded);
+ /** @type {Set} */ (expected_hashlinks.get(key)).add(decoded);
}
enqueue(decoded, decodeURI(pathname), pathname);
diff --git "a/packages/kit/test/prerendering/basics/src/routes/enc\303\266ded-hash-link/+page.svelte" "b/packages/kit/test/prerendering/basics/src/routes/enc\303\266ded-hash-link/+page.svelte"
new file mode 100644
index 000000000000..a895dfd0b53c
--- /dev/null
+++ "b/packages/kit/test/prerendering/basics/src/routes/enc\303\266ded-hash-link/+page.svelte"
@@ -0,0 +1,3 @@
+