2015-08-26 14 views
0

我編寫了一個Java Web應用程序,該應用程序獲取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中的項目編碼不一致 - 應用程序輸出中的國家字符錯誤

我使用IntelliJ和Gradle。項目編碼最初設置爲windows-1250,但我將其更改爲UTF-8(文件 - >設置 - >編碼或類似的文件)。當我運行通過「運行」中的IntelliJ按鈕的應用程序(它使用JDK_directory \ BIN \ Java來啓動應用程序),返回的結果是正確的,看起來它應該:

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

但是當我運行相同通過搖籃任務(gradle這個構建和運行的gradle)的應用程序,其結果是:

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

(波蘭字符是不正確;同樣happends與其他語言,例如用「變音符」在德語字母)。順便說一句。 IntelliJ的配置方式是,它在生成項目時運行Gradle構建任務。這是非常混亂和不舒服。我插

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正在刪除一個反斜槓,因此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); 
    } 
} 
+0

沒有Gradle編碼,Intellij編碼,Java編碼:只有至少一個文本交換,其中發送者和接收者不使用相同的字符集。你應該找出所有這樣的交流。例如,你在哪裏看到錯誤的文字?使用'System.out.pritln(String)'寫入標準cmd嗎?閱讀怎麼樣?您的HTTP客戶端是否使用UTF-8解碼YouTube響應? – Raffaele

+0

@Raffaele通常,輸出以JSON對象的形式發送到Android應用程序。我也可以從我的Web瀏覽器向Web應用程序發送查詢。通過網絡瀏覽器查詢時問題是一樣的。我確實把'System.out.println(String)'和打印的文本相同(我的意思是,在IntelliJ中啓動時正確,在通過控制檯中的Gradle啓動時是錯誤的)。當我在Firefox中輸入http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=rvCtDwoCqGM&format=xml時,文本會正確顯示。 – user3855877

+0

再次,沒有看到一個人不能說的代碼。另一個不一致:Android應用程序通常是客戶端,所以你可以*發送*數據到客戶端?無論如何,我想在從YouTube上閱讀時出現錯誤。請發佈相關代碼,以瞭解如何檢索數據並將其存儲爲字符串 – Raffaele

回答

0

你不指定編碼源了,所以它默認爲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=...是否給出。正則表達式:

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

如果這一切都變得太多,可以在InputStream上使用XML讀取器。

+0

您的回答聽起來很有趣。無論如何,我通過另一臺計算機上的gradle啓動了我的web應用程序(使用Ubuntu 14.04),結果正常。但是我會嘗試你的解決方案來檢查我的web應用程序是否可以獨立於系統。 – user3855877

+0

在Ubuntu上,默認編碼通常是UTF-8。 –

相關問題