You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8中URLDecoder解码非ASCII URL,生成exe后写入txt乱码,NetBeans运行正常

URL解码写入TXT文件出现乱码(仅打包为EXE时触发)

我尝试解码URL %D0%9A%D1%80%D0%B0%D1%81%D0%B0%D0%B2%D0%B8%D1%86%D0%B5-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%B0%D1%8F-%D0%BD%D1%8E%D1%85%D0%B0%D0%BB%D0%B0-%D1%82%D0%B0%D0%B1%D0%B0%D0%BA,将结果写入.txt文件后得到Кра�?авице-котора�?-нюхала-табак,内容包含问号替换字符。

问题仅在以下场景出现:通过NetBeans IDE使用Inno Setup Compiler将项目打包为.exe文件并运行时;直接在NetBeans 8.2中运行项目则无异常,写入.txt的URL显示完全正常。我使用的Java版本是1.8.0。

相关代码

File newPath = new File(pathTextField.getText() + "\\" + filename.matcher(sitemapMatcher.group(i)).replaceAll("$2") + "_" + renameFile + ".txt");
FileWriter writeUrl = new FileWriter(newPath);

URL sitemapUrl = new URL(sitemapMatcher.group(i));
URLConnection sitemapUrlConn = sitemapUrl.openConnection();
sitemapUrlConn.setRequestProperty("User-Agent", userAgentArray[randomUserAgent.nextInt(userAgentArray.length)]);
sitemapUrlConn.connect();

BufferedReader sitemapUrlIn = new BufferedReader(new InputStreamReader(sitemapUrlConn.getInputStream(), StandardCharsets.UTF_8.name()));
String sitemapUrlInputLine;

if (clearCheck.isSelected()) {
    while ((sitemapUrlInputLine = sitemapUrlIn.readLine()) != null) {
        final Pattern sitemapUrlPattern = Pattern.compile(regex);
        final Matcher sitemapUrlMatcher = sitemapUrlPattern.matcher(sitemapUrlInputLine);

        while (sitemapUrlMatcher.find()) {
            for (int j = 1; j <= sitemapUrlMatcher.groupCount(); j++) {
                if (sitemapUrlMatcher.group(j) != null) {
                    if (regexArray.length > 1 && regexArray.length == replaceArray.length) {
                        final Pattern resultCleanUrl = Pattern.compile(regexArray[0]);
                        if (resultCleanUrl.matcher(sitemapUrlMatcher.group(j)).replaceAll(replaceArray[0]) != null) {
                            tempCleanURL = URLDecoder.decode(resultCleanUrl.matcher(sitemapUrlMatcher.group(j)).replaceAll(replaceArray[0]));
                            for (int indexArray = 1; indexArray < regexArray.length; indexArray++) {
                                if (indexArray + 1 == regexArray.length) {
                                    tempCleanURL = tempCleanURL.replaceAll(regexArray[indexArray], replaceArray[indexArray]);
                                    String cleanUrlSpaceText = tempCleanURL.replaceAll("(\\s+)", " ");
                                    writeUrl.write(cleanUrlSpaceText.trim() + "\n");
                                } else {
                                    tempCleanURL = tempCleanURL.replaceAll(regexArray[indexArray], replaceArray[indexArray]);
                                }
                            }
                        } else {
                            tempCleanURL = URLDecoder.decode(sitemapUrlMatcher.group(j));
                            writeUrl.write(tempCleanURL.trim() + "\n");
                        }
                    } else {
                        final Pattern resultCleanUrl = Pattern.compile(regexArray[0]);
                        if (resultCleanUrl.matcher(sitemapUrlMatcher.group(j)).replaceAll(replaceArray[0]) != null) {
                            tempCleanURL = URLDecoder.decode(resultCleanUrl.matcher(sitemapUrlMatcher.group(j)).replaceAll(replaceArray[0]));
                            writeUrl.write(tempCleanURL.trim() + "\n");
                        } else {
                            tempCleanURL = URLDecoder.decode(sitemapUrlMatcher.group(j));
                            writeUrl.write(tempCleanURL.trim() + "\n");
                        }
                    }
                } else {
                    writeUrl.write("sitemapUrlMatcher[j] null \n");
                }
            }
        }
    }
} else {
    while ((sitemapUrlInputLine = sitemapUrlIn.readLine()) != null) {
        final Pattern sitemapUrlPattern = Pattern.compile(regex);
        final Matcher sitemapUrlMatcher = sitemapUrlPattern.matcher(sitemapUrlInputLine);

        while (sitemapUrlMatcher.find()) {
            for (int j = 1; j <= sitemapUrlMatcher.groupCount(); j++) {
                if (sitemapUrlMatcher.group(j) != null) {
                    tempCleanURL = URLDecoder.decode(sitemapUrlMatcher.group(j));
                    writeUrl.write(tempCleanURL.trim() + "\n");
                } else {
                    writeUrl.write("sitemapUrlMatcher[j] null \n");
                }
            }
        }
    }
}

writeUrl.flush();
writeUrl.close();

运行结果对比

  • EXE运行时错误结果:文本显示为 Кра�?авице-котора�?-нюхала-табак(包含问号替换字符,部分西里尔文字符无法正常显示)
  • NetBeans直接运行正确结果:文本显示为完整的西里尔文 Красавице-которая-нюхала-табак

内容的提问来源于stack exchange,提问作者Alvisa Rizky Rachman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:15:43