首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IntelliJ中不一致的项目编码和app输出中的错误国家字符

IntelliJ中不一致的项目编码和app输出中的错误国家字符
EN

Stack Overflow用户
提问于 2015-08-26 19:06:05
回答 1查看 1.2K关注 0票数 0

我编写了一个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启动应用程序)时,返回的结果是正确的,并且看起来是应该的:

代码语言:javascript
复制
"video_title":"Na tym obrazie jest coś więcej. Kolejna tajemnica Mona Lisy"

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

代码语言:javascript
复制
"video_title":"Na tym obrazie jest coś więcej. Kolejna tajemnica Mona Lisy"

(波兰字母不正确;在其他语言中也是如此,例如德语中带有“Umlaut”的字母)。顺便说一句。IntelliJ是按照它在创建项目时运行Gradle build任务的方式配置的。这是非常混乱和不舒服的。我插入

代码语言:javascript
复制
tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }

代码语言:javascript
复制
[ compileJava, compileTestJava ]*.options*.encoding = "UTF-8"

代码语言:javascript
复制
[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文本获得的标题:

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-08-27 07:12:29

您没有指定源有哪些编码,所以它默认为System.getProperty("file.encoding"),这与您发现的不同。你可以尝试这两种编码;我猜是UTF-8。

代码语言:javascript
复制
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
BufferedReader br = new BufferedReader(new InputStreamReader(is, "Windows-1252"));

然而,UTF-8可能会产生错误。

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

代码语言:javascript
复制
con.getContentType()
con.getHeaderFields()

否则,您可以在字符串中搜索<?xml ....>并检查是否给出了encoding=...。Regex:

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

如果这一切都太多了,人们可能会在InputStream上使用XML读取器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32234747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档