diff --git a/frontend/app.html b/frontend/app.html index 31818db..f48b5d4 100644 --- a/frontend/app.html +++ b/frontend/app.html @@ -1373,7 +1373,7 @@ -
{{ file.displayName || file.name }}
+
{{ getFileDisplayName(file) }}
{{ file.isDirectory ? '文件夹' : file.sizeFormatted }}
@@ -1419,9 +1419,9 @@ - {{ file.displayName || file.name }} - - + {{ getFileDisplayName(file) }} + + {{ file.isDirectory ? '-' : file.sizeFormatted }} {{ formatDate(file.modifiedTime) }} diff --git a/frontend/app.js b/frontend/app.js index 0eec044..02755a4 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -2015,6 +2015,48 @@ handleDragLeave(e) { return d.toLocaleString(); }, + // HTML实体解码(前端兜底,防止已实体化的文件名显示乱码) + decodeHtmlEntities(str) { + if (typeof str !== 'string') return str; + const entityMap = { + amp: '&', + lt: '<', + gt: '>', + quot: '"', + apos: "'", + '#x27': "'", + '#x2F': '/', + '#x60': '`' + }; + const decodeOnce = (input) => + input.replace(/&(#x[0-9a-fA-F]+|#\d+|[a-zA-Z]+);/g, (match, code) => { + if (code[0] === '#') { + const isHex = code[1]?.toLowerCase() === 'x'; + const num = isHex ? parseInt(code.slice(2), 16) : parseInt(code.slice(1), 10); + if (!Number.isNaN(num)) { + return String.fromCharCode(num); + } + return match; + } + const mapped = entityMap[code]; + return mapped !== undefined ? mapped : match; + }); + let output = str; + let decoded = decodeOnce(output); + while (decoded !== output) { + output = decoded; + decoded = decodeOnce(output); + } + return output; + }, + + getFileDisplayName(file) { + if (!file) return ''; + const base = file.displayName || file.name || ''; + const decoded = this.decodeHtmlEntities(base); + return decoded || base; + }, + openShare(url) { if (!url) return; const newWindow = window.open(url, '_blank', 'noopener');