diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts
index ee398b99f..874e4b94b 100644
--- a/packages/astro/src/core/build/generate.ts
+++ b/packages/astro/src/core/build/generate.ts
@@ -311,7 +311,7 @@ async function generatePath(
 		scripts,
 		renderers,
 		async resolve(specifier: string) {
-			const hashedFilePath = internals.entrySpecifierToBundleMap.get(specifier);
+			const hashedFilePath = internals.entrySpecifierToBundleMap.get(decodeURI(specifier));
 			if (typeof hashedFilePath !== 'string') {
 				// If no "astro:scripts/before-hydration.js" script exists in the build,
 				// then we can assume that no before-hydration scripts are needed.
diff --git a/packages/astro/src/core/build/vite-plugin-analyzer.ts b/packages/astro/src/core/build/vite-plugin-analyzer.ts
index a859bcd7c..6ca635f54 100644
--- a/packages/astro/src/core/build/vite-plugin-analyzer.ts
+++ b/packages/astro/src/core/build/vite-plugin-analyzer.ts
@@ -83,7 +83,7 @@ export function vitePluginAnalyzer(internals: BuildInternals): VitePlugin {
 
 				for (const c of astro.hydratedComponents) {
 					const rid = c.resolvedPath ? resolveClientDevPath(c.resolvedPath) : c.specifier;
-					internals.discoveredHydratedComponents.add(rid);
+					internals.discoveredHydratedComponents.add(decodeURI(rid));
 				}
 
 				// Scan hoisted scripts