当前位置: 首页 > 知识库问答 >
问题:

IntelliJ和Gradle中的项目编码不一致-应用程序输出中的国家字符错误

屠杰
2023-03-14

我编写了一个Java web应用程序,可以获取Youtube电影的标题并将其发送给客户端。我使用链接http://www.youtube.com/oembed?url=“电影URL”

我使用IntelliJ和Gradle。项目编码最初设置为Windows-1250,但我将其更改为UTF-8(文件-

"video_title":"Na tym obrazie jest coś więcej. Kolejna tajemnica Mona Lisy"

但当我通过Gradle任务(Gradle build和Gradle run)运行同一个应用程序时,结果是:

"video_title":"Na tym obrazie jest coś więcej. Kolejna tajemnica Mona Lisy"

(波兰语字符不正确;其他语言也有同样的情况,例如德语中带有“Umlaut”的字母)。顺便说一句,IntelliJ的配置方式是在创建项目时运行Gradle build task。这是非常令人困惑和不舒服的。我插入

tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }

[ compileJava, compileTestJava ]*.options*.encoding = "UTF-8"

[compileJava, compileTestJava]*.options.collect {options -> options.encoding = 'UTF-8'}

建造。脚本文件,但没有任何帮助。

我想知道这种差异的原因是什么。有可能让Gradle“忘记”旧编码,“专注”于新编码:)?也许再次创建项目(这次从一开始就使用正确的编码)并将Java和Gradle代码从旧项目复制到新项目会有所帮助?

编辑:早些时候,我从YT获得的JSON对象中提取标题(我将格式参数更改为json),但是波兰字母显示为\uXXXX。我的应用程序以\\uXXXX的形式发送,Android删除了一个反斜杠,所以Android应用程序中的文本显示为\uXXXX。这就是为什么我被移动到XML。这就是我从XML文本中获得标题的原因:

URL url = new URL("http://www.youtube.com/oembed?url=" + movieUrl + "&format=xml");
URLConnection con = url.openConnection();
InputStream is = con.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String xml;
int startIndex, endIndex;
while ((xml = br.readLine()) != null) {
    if (xml.contains("<title>")) {
        startIndex = xml.indexOf("<title>");
        endIndex = xml.indexOf("</title>");
        System.out.println(xml.substring(startIndex + 7, endIndex));
        return xml.substring(startIndex + 7, endIndex);
    }
}

共有1个答案

滕学义
2023-03-14

您没有指定源代码的编码,因此它默认为System。getProperty(“file.encoding”)根据您的发现而有所不同。你可以尝试两种编码;我猜是UTF-8。

BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
BufferedReader br = new BufferedReader(new InputStreamReader(is, "Windows-1252"));

然而,UTF-8可能会出现错误。

理想的情况是,如果头包含字符集;转储它们:

con.getContentType()
con.getHeaderFields()

否则,您可以在字符串中搜索

Pattern encodingPattern =
    Pattern.compile("(?is)<\?xml[^>]*\\sencoding=['\"]([^'\"]+)['\"]");
Matcher m = encodingPattern.matcher(xml);
if (m.find()) {
    String encoding = m.group(1);

如果这一切变得太多,人们可能会在输入流上使用XML阅读器。

 类似资料:
  • 通常情况下,我不会在这里问问题,但我面对的问题太可怕了,我再也无法独自应对了,我已经筋疲力尽了。无论如何,我要描述我所发现的一切,我发现了许多有趣的事情,我想相信这些事情会帮助别人帮助我。 软件版本:-OS: Windows 10 Pro version: 1909 build: 18363.720-IntelliJ IDEA: 2019.2.4 Ultime-Gradle包装版本: 5.2.1-

  • 我正在Windows 7上与IntelliJ IDEA 14.1.2合作。我的项目使用Gradle 2.5。每次我用打开一个项目,我的所有文件都会被设置为windows-1252编码。是否有一种简单的方法可以将文件,以便IntelliJ自动使用此设置? 即使将设置为UTF-8,文件仍以windows-1252打开。 可以进入设置并为每个文件手动设置编码(通过将其应用于项目根),但这并不理想,因为每

  • 我有一个基于gradle的kotlin/java项目,使用intellij IDEA进行开发。 由于项目是基于gradle的,所以所有构建工件都位于gradles build/directory |文件夹下。 但也有所有的

  • 我有一个在Swagger上具有编译依赖关系的项目,它带来了jackson databind v2.4.5,还有一个在库上具有testCompile依赖关系的项目,该库使用了AWS SDK,它带来了jackson databind v2.6.6。 从gradle运行测试时,一切正常,正确更新的jackson依赖项v2.6.6位于类路径上: intellij依存关系包含两个版本: 然而,当从Intel

  • 这似乎真的很疯狂,但在我的IntelliJ想法的控制台中,我不能用中断的编码做任何事情。 我为克服这一点所做的事情: 在

  • 我正在从事一个使用gradle 1.7和gradle的idea插件构建的遗留项目。在教室里。创意目录中有一个模块。指定Java编译输出目录的xml,该目录将所有子项目编译到一个根级别的输出目录中。然而,当更新到gradle 4.2时,会生成一个新的模块目录,并且模块的所有输出都会放在每个子项目的输出目录中。 是否可以使用gradle 4.2.1定义子项目出目录的位置