簡體   English   中英

Java字符串編碼-Linux與Windows不同

[英]Java String encoding - Linux different than on Windows

我已經創建了一個Java程序(REST)服務。 整個開發/測試都是在Windows上完成的,現在可以進行生產測試的部署了。 但是,出現了“小”編碼問題:

String s3 = new String("grün".getBytes(), "UTF-8");
logger.info(s3);
logger.info("das ist wirklich grün");
logger.info(new String("das ist wirklich grün".getBytes("UTF-8"), "UTF-8"));

我通過HTTP屬性(Web應用程序托管在tomcat上,在具有auth插件的apache后面)收到一些必須處理的值。 它們的編碼方式就像您在第1行中看到的一樣。(此值在Windows和Linux上均顯示)。

當我像第1行一樣將其轉換為UTF-8並將其寫入日志文件(log4j)時,我在Windows機器上使用的術語是“grün”(正確)。 在linux服務器上,我仍然有相同的輸出。

然后,我嘗試像第2行一樣直接使用Umlaute(üäö等),並且在Windows和Linux上,該值均正確寫入了日志文件。 然后,我嘗試像第3行一樣進行一些轉換,但是結果相同:兩個操作系統都顯示相同的結果。

兩台機器在Java中都具有相同的語言環境(Locale.getDefault())->我已經嘗試過了。 我無法更改將值插入HTTP請求的方式!

像這樣的東西是無效的:

String s3 = new String("grün".getBytes(), "UTF-8");

這里發生的情況:使用運行此程序的系統的默認字符編碼獲取字符串"grün"的字節(因為您未在對getBytes()的調用中指定編碼),然后將其轉換字節返回給String ,指定這些字節為UTF-8編碼的文本:

字符=>缺省字符編碼中的字節(可以為UTF-8,也可以不為UTF-8)=>轉換回字符,就好像字節是UTF-8編碼的文本

顯然,只有在系統的默認字符編碼為UTF-8的情況下,這才能正常工作。 在Windows上不是(可能是Windows-1252 )。

字符串本身沒有字符編碼 沒有諸如“ UTF-8字符串”或“將字符串從X轉換為UTF-8”之類的東西。 字符編碼指定字符串中的字符如何轉換為字節,反之亦然,但這不是字符串本身的屬性。 可以有一個字節數組,它表示以特定字符編碼方式編碼的文本。 (就像“十進制”和“十六進制”一樣,數字本身並不是屬性,只是數字的顯示方式)。

不要以依賴於正在運行的系統的默認字符編碼的方式編寫程序; 這意味着,例如,不要在未指定字符編碼的情況下在String上調用getBytes()如果未指定,則其他API調用將使用默認編碼)。

兩台機器在Java中都具有相同的語言環境( Locale.getDefault() )->我已經嘗試過了。

它是默認字符集,而不是默認語言環境,它決定了在對沒有指定字符集的字符串進行解碼/編碼時使用什么字符集。

檢查Windows和Linux計算機上返回的Charset.defaultCharset().name()返回什么。 我希望它們會有所不同,具體取決於您報告的症狀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM