我编写了一个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);
}
}
您没有指定源代码的编码,因此它默认为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定义子项目出目录的位置