2

JCA 1.7 specification通過尋找我只能找到在其上的資源適配器Deployment Descriptor例子之一以下的(第13章:消息流入P 13-50): JCA DD example showing UTF-8 encoding 這個例子示出UTF-8編碼的使用,但是沒有什麼說這是否是示例插圖的可選選項或文件字符編碼的必須限制。JCA部署描述符(ra.xml)字符編碼應該是什麼?

我問這個,因爲我正在寫一個Java程序來讀取這些文件之一,FindBugs™是給我這個消息:

DM_DEFAULT_ENCODING:依賴於默認編碼 發現調用的方法它將執行一個字節到字符串(或 字符串到字節)的轉換,並假定默認平臺 編碼是合適的。這會導致應用程序行爲 因平臺而異。使用替代API並明確指定字符集名稱或字符集對象。

在這個Java代碼片斷4號線就是將指定的字符編碼:

01. byte[] contents = new byte[1024]; 
02. int bytesRead = 0; 
03. while ((bytesRead = bin.read(contents)) != -1) 
04.  result.append(new String(contents, 0, bytesRead)); 

那麼,是否可以指定該文件的預期編碼在這種情況下不?

+0

UTF-8好。你可以在代碼中看到FindBugs警告嗎? –

+0

@Thomas它不是關於UTF-8的好壞:)它更多的是關於用戶是否可以指定其他字符編碼。爲了您的方便,我提供了一個示例代碼。 –

+1

如果使用'new String(contents,0,bytesRead,StandardCharsets.UTF_8)',FindBugs警告應該消失。您應該在XML頭文件和代碼中指定相同的字符集。我不知道有一個限制,說你必須使用UTF-8。 –

回答

2

從我看到的,大多數人使用他們的ra.xml的UTF-8編碼。但是使用其他編碼沒有限制。因此,如果您的解析僅基於期望的UTF-8,則結果可能不如預期。

因此,您需要在代碼中對此進行計數,或者以正常文本的形式閱讀此文件,或者將其作爲xml文件讀取,並將自己保存爲頭痛。我認爲性能上的差異不會成爲問題,因爲ra.xml文件通常不會增長到千兆字節。至少到目前爲止,我見過的平均只有幾兆字節。

對於Findbug問題,您只需要將編碼指定爲UTF-8。否則,您將使用在虛擬機啓動期間確定的JVM的默認值,並且通常取決於底層操作系統的區域設置和字符集。儘管在此使用默認不是推薦的行爲,但如果這是您想要的,那麼只需指定默認編碼的用法。這將擺脫Findbug問題。

所以,你的代碼看起來像這樣的事情:

01. byte[] contents = new byte[1024]; 
02. int bytesRead = 0; 
03. while ((bytesRead = bin.read(contents)) != -1) 
04.  result.append(new String(contents, 0, bytesRead, Charset.defaultCharset())); 
1

FindBugs只是警告你,你依賴於默認的系統編碼,所以如果你的應用程序將被另一個國家的其他用戶啓動,你可能會得到意想不到的結果。最好明確指定要使用的編碼。

在你的情況下,應該從XML文件中提取實際的編碼。有幾種方法可以獲得它。一種方法是使用XMLStreamReader,如this中所述。