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
相关产品推荐
相关产品推荐

