日语环境下Chrome/Edge使用localexplorer协议打开日文路径本地文件报错
问题根因
- 你的编码逻辑完全没有生效:代码中完成SJIS转码后得到的
sjis变量没有被使用,window.open方法传入的还是未转码的原始url变量 - 你需要先确认本地
localexplorer://自定义协议对应的处理程序支持的参数编码格式,并不是所有处理程序都默认接收SJIS编码的路径参数
修复方案
- 先修正变量调用错误,测试SJIS编码是否可用:
url = 'localexplorer:' + event.target.innerText; array = str2array(url); sjis_array = Encoding.convert(array, "SJIS", "UNICODE"); sjis = Encoding.codeToString(sjis_array); window.open(sjis, '_blank'); // 这里替换为转码后的变量
- 如果上述修改后仍报错,说明协议处理程序不支持直接传入SJIS字符串,改为使用UTF-8 URI编码方案,大部分现代自定义协议处理程序都支持该格式:
// 不需要转SJIS,直接对路径做URI编码即可 const filePath = encodeURIComponent(event.target.innerText) const url = 'localexplorer:' + filePath window.open(url, '_blank')
- 如果以上两种方案都失效,需要将路径转换为对应编码的字节数组后手动做百分号编码,再拼接到协议前缀后使用,示例逻辑如下:
const rawPath = event.target.innerText const array = str2array(rawPath); const sjis_array = Encoding.convert(array, "SJIS", "UNICODE"); // 逐个字节转为%XX格式 const encodedPath = sjis_array.map(byte => '%' + byte.toString(16).padStart(2, '0')).join('') const url = 'localexplorer:' + encodedPath window.open(url, '_blank')
内容的提问来源于stack exchange,提问作者西浦直志
相关产品推荐
相关产品推荐

