2017-07-24 143 views
2

我有一個在Linux上的WebSphere Liberty上運行的項目。 我的語言是巴西葡萄牙語,我們有一些重音詞。 我的Java代碼將像下面的一些用戶消息:奇怪的字符編碼

... 
ErroResponse erroResponse = new ErroResponse(); 
erroResponse.setMensagem("Esse grupo não pode ser criado. Já existe um grupo criado com esse nome."); 
response = Response.status(Status.BAD_REQUEST).entity(erroResponse).build(); 
... 

當同樣的消息顯示給用戶,它看起來是這樣的: enter image description here

我不認爲這是一個瀏覽器編碼的問題,因爲該消息在我的服務器日誌中看起來相同。 enter image description here

我試圖設置使用-Dclient.encoding.override JVM編碼-Dfile.encoding到ISO-8859-1和UTF-8,但沒有成功。

在Windows服務器上運行的相同項目運行正常,顯示帶有正確口音的消息。

只有直接寫在源代碼中的消息存在這個問題。來自數據庫查詢結果的重音單詞正確呈現。

我正在使用Suse 11.4。

我真的很感激任何幫助。

感謝

+1

一(這裏不太可能),原因可能是Java源代碼編輯爲UTF-8,但編譯成例如ISO-8859-1。 (更常見於JSP)。嘗試使用'\ u00E3'而不是''來檢查它。 –

+0

我該如何強制它編譯爲UTF-8而不是ISO-8859-1? –

+0

@JoopEggen你是對的。您的評論後,我可以找到解決方案。謝謝。 –

回答

0

嘗試查看您的SUSE編碼和語言,這樣做:

$ echo $LC_CTYPE 
ISO-8859-1 

$ echo $LANG 
pt_BR 

獲取所有語言:

$ locale -a 

更改爲pt_PT.utf8:

$ export LC_ALL=pt_PT.utf8 
$ export LANG="$LC_ALL" 
+0

我試圖設置爲pt_BR.utf8和en_US.iso885915。仍然沒有成功。 –

0

這很可能是b安伏添加這些JVM編碼屬性,你得到的響應該字符的UTF-8編碼,但您的瀏覽器卻不願意將其解釋爲UTF-8。我建議刪除它們並保留在JAX-RS資源中。

一個有用的調試步驟是查看與客戶端和十六進制編輯器(如od -t x1)一樣的命令的響應,因爲有很多事情可以模糊實際正在傳輸的數據(瀏覽器,終端仿真器等)。

如果你明確地告訴服務器使用的字符集(UTF-8或本地代碼頁像ISO8859-1)你的字符串將被轉換爲指定的代碼頁。瀏覽器還會在Content-Type標題中看到字符集。

最簡單的方法是使用@Produces在JAX-RS爲:

@Produces("text/html; charset=UTF-8") 

@Produces("text/html; charset=ISO8859-1") 
0

問題解決了更改項目文本編碼。默認情況下,日食被保存源代碼爲UTF-8和javac編譯了它作爲CP1252(Windows默認)。

爲了使這一變化,我不得不右鍵點擊項目 - >屬性 - >資源再改文本文件編碼到其他(ISO-8859-1)。