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