[英]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.