簡體   English   中英

tomcat/spring 服務器 REST 輸入編碼錯誤

[英]Wrong encoding for tomcat/spring server REST input

我有使用 Tomcat 8 和 Spring v5.3.18 制作的 REST 服務。 該服務獲取一個字符串並將其存儲在數據庫中。

我對此輸入有疑問:

{"name": "Pawe\u0142"}

它是一個有效的 UTF8 字符。 保存的字符串是Pawe? 所以有什么不對...

我開始檢查可能是缺少編碼的地方,但我發現它取決於 tomcat 環境。 具有相同軟件的兩台服務器,鏈接到一個公共數據庫但具有不同的操作系統,第一個是 Linux,第二個是 Windows 有不同的響應。

Windows 服務器正在工作並存儲有效的 UTF8 字符,linux 服務器不工作並將字符存儲為“?”。

所以我推斷它與軟件或軟件配置中缺少編碼無關,但可能與 tomcat 或 java 有關。

你知道什么是錯誤的嗎?

可能的原因可能是LC_CTYPE linux 語言環境或file.encoding JVM 屬性:

  • Linux LC_CTYPE(或 LC_ALL)區域設置為 UTF-8 以外的區域。模擬為

    LC_CTYPE="ISO-8859-1" jshell jshell> import java.nio.charset.Charset; jshell> Charset.defaultCharset() $2 ==> US-ASCII jshell> String a = "adf ł"; a ==> "adf?"
  • JVM 的file.encoding屬性設置為 UTF-8 以外的值

    jshell -J-Dfile.encoding="ISO-8859-1" --execution="local" jshell> import java.nio.charset.Charset; jshell> Charset.defaultCharset() $2 ==> ISO-8859-1 jshell> String a = "adf ł"; a ==> "adf?" jshell -J-Dfile.encoding="UTF-8" --execution="local" jshell> String a = "adf ł"; a ==> "adf ł"

Linux 快速測試

java -Dfile.encoding="ISO-8859-1" -XshowSettings:properties -version 2>&1 | grep 'encoding'
    file.encoding = ISO-8859-1
    sun.io.unicode.encoding = UnicodeLittle
    sun.jnu.encoding = UTF-8

java -XshowSettings:properties -version 2>&1 | grep 'encoding'
    file.encoding = UTF-8
    sun.io.unicode.encoding = UnicodeLittle
    sun.jnu.encoding = UTF-8

ps -lf -C jshell | grep 'file.encoding'
0 S lmc      7266  2225 10  80   0 - 895886 -     14:48 pts/2    00:00:05 jshell -J-Dfile.encoding=ISO-8859-1 --execution=local


LC_ALL="es_ES.ISO-8859-1" java -help 2>&1 | tail -n-3
Para especificar un argumento para una opci�n larga, puede usar --<nombre>=<valor> o
--<nombre> <valor>.

最后,錯誤出現在 DB / JDBC 的連接字符串中。

對於 Mysql 驅動程序,我必須將一些參數傳遞給連接字符串 URL append:

dbConnectionString=jdbc:mysql://localhost/test?useSSL=false&useUnicode=true&characterEncoding=utf-8

暫無
暫無

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

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