我编写了一个Java应用程序,它获取Youtube的电影标题并将其发送给客户端。我通过链接http://www.youtube.com/oembed?url=" + movieUrl + "&format=xml (例如http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=rvCtDwoCqGM&format=xml)从互联网上接收标题。带有XML标记的字符串将转到我的应用程序中。在那里,我提取标题并发送给客户。
我使用IntelliJ和Gradle。项目编码最初被设置为windows-1250,但我将其更改为UTF-8 (文件、->设置、->文件、编码或类似文件)。当我通过IntelliJ中的“run”按钮运行该应用程序(它使用JDK_directory\bin\java启动应用程序)时,返回的结果是正确的,并且看起来是应该的:
"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任务的方式配置的。这是非常混乱和不舒服的。我插入
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}和
[ compileJava, compileTestJava ]*.options*.encoding = "UTF-8"和
[compileJava, compileTestJava]*.options.collect {options -> options.encoding = 'UTF-8'}进入build.script文件,但没有任何帮助。
我想知道这种差异的原因是什么。它有可能让Gradle‘忘记’旧的编码,并‘集中’在新的:)?也许再次创建项目(从一开始就使用正确的编码)并将Java和Gradle代码从旧项目复制到新项目可能会有帮助吗?
编辑:早些时候,我从从YT获得的JSON对象中提取标题(我将format参数更改为json),但是波兰字母被表示为\uXXXX。我的应用程序是在\\uXXXX和Android删除一个反斜杠时发送的,所以安卓应用程序中的文本显示为\uXXXX。这就是我被转移到XML的原因。这是was从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);
}
}发布于 2015-08-27 07:12:29
您没有指定源有哪些编码,所以它默认为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()否则,您可以在字符串中搜索<?xml ....>并检查是否给出了encoding=...。Regex:
Pattern encodingPattern =
Pattern.compile("(?is)<\?xml[^>]*\\sencoding=['\"]([^'\"]+)['\"]");
Matcher m = encodingPattern.matcher(xml);
if (m.find()) {
String encoding = m.group(1);如果这一切都太多了,人们可能会在InputStream上使用XML读取器。
https://stackoverflow.com/questions/32234747
复制相似问题