diff --git a/CHANGELOG.md b/CHANGELOG.md
index f6644f016c..ea243c19e7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,7 @@ You should also include the user name that made the change.
 
 ### Bugfixes
 - Server: Fix crash at startup if TensorFlow is not supported @mei23
+- Client: URLエンコードされたルーティングを修正
 
 ## 12.112.3 (2022/07/09)
 
diff --git a/packages/client/src/components/global/url.vue b/packages/client/src/components/global/url.vue
index 34ba9024cc..dc79a20649 100644
--- a/packages/client/src/components/global/url.vue
+++ b/packages/client/src/components/global/url.vue
@@ -1,5 +1,6 @@
 <template>
-<component :is="self ? 'MkA' : 'a'" ref="el" class="ieqqeuvs _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target"
+<component
+	:is="self ? 'MkA' : 'a'" ref="el" class="ieqqeuvs _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target"
 	@contextmenu.stop="() => {}"
 >
 	<template v-if="!self">
@@ -23,14 +24,7 @@ import { toUnicode as decodePunycode } from 'punycode/';
 import { url as local } from '@/config';
 import * as os from '@/os';
 import { useTooltip } from '@/scripts/use-tooltip';
-
-function safeURIDecode(str: string) {
-	try {
-		return decodeURIComponent(str);
-	} catch {
-		return str;
-	}
-}
+import { safeURIDecode } from '@/scripts/safe-uri-decode';
 
 export default defineComponent({
 	props: {
@@ -42,7 +36,7 @@ export default defineComponent({
 			type: String,
 			required: false,
 			default: null,
-		}
+		},
 	},
 	setup(props) {
 		const self = props.url.startsWith(local);
diff --git a/packages/client/src/nirax.ts b/packages/client/src/nirax.ts
index cd29ae87a5..7587901d70 100644
--- a/packages/client/src/nirax.ts
+++ b/packages/client/src/nirax.ts
@@ -3,6 +3,7 @@
 import { EventEmitter } from 'eventemitter3';
 import { Ref, Component, ref, shallowRef, ShallowRef } from 'vue';
 import { pleaseLogin } from '@/scripts/please-login';
+import { safeURIDecode } from '@/scripts/safe-uri-decode';
 
 type RouteDef = {
 	path: string;
@@ -116,7 +117,7 @@ export class Router extends EventEmitter<{
 					}
 					if (p.wildcard) {
 						if (parts.length !== 0) {
-							props.set(p.name, parts.join('/'));
+							props.set(p.name, safeURIDecode(parts.join('/')));
 							parts = [];
 						}
 						break pathMatchLoop;
@@ -124,10 +125,10 @@ export class Router extends EventEmitter<{
 						if (p.startsWith) {
 							if (parts[0] == null || !parts[0].startsWith(p.startsWith)) continue forEachRouteLoop;
 
-							props.set(p.name, parts[0].substring(p.startsWith.length));
+							props.set(p.name, safeURIDecode(parts[0].substring(p.startsWith.length)));
 							parts.shift();
 						} else {
-							props.set(p.name, parts[0]);
+							props.set(p.name, safeURIDecode(parts[0]));
 							parts.shift();
 						}
 					}
@@ -137,7 +138,7 @@ export class Router extends EventEmitter<{
 			if (parts.length !== 0) continue forEachRouteLoop;
 
 			if (route.hash != null && hash != null) {
-				props.set(route.hash, hash);
+				props.set(route.hash, safeURIDecode(hash));
 			}
 
 			if (route.query != null && queryString != null) {
@@ -147,7 +148,7 @@ export class Router extends EventEmitter<{
 				for (const q in route.query) {
 					const as = route.query[q];
 					if (queryObject[q]) {
-						props.set(as, queryObject[q]);
+						props.set(as, safeURIDecode(queryObject[q]));
 					}
 				}
 			}
diff --git a/packages/client/src/scripts/safe-uri-decode.ts b/packages/client/src/scripts/safe-uri-decode.ts
new file mode 100644
index 0000000000..301b56d7fd
--- /dev/null
+++ b/packages/client/src/scripts/safe-uri-decode.ts
@@ -0,0 +1,7 @@
+export function safeURIDecode(str: string): string {
+	try {
+		return decodeURIComponent(str);
+	} catch {
+		return str;
+	}
+}