我们最近将一个应用程序从WAS 7.0(在AIX上)移到了WAS 8.5.5(在Linux上)。它与几个以xml
形式发送数据的应用程序连接使用 -
从标题中检索XMLwhile ((i = request.getReader().read(buf, 0, buf.length)) != -1) {
sb.append(buf, 0, i);
}
然而,转换后,我们发现应用程序没有正确处理è或©等特殊字符 - 它们是乱码。
这对我来说就像一个编码问题。任何人都可以指出需要检查什么来了解根本原因吗?
我正在进一步阅读此内容,我发现我可以将JVM参数设置为
-Dclient.encoding.override=UTF-8
始终使用UTF-8。这是一个好习惯吗?
修改:
Locale output in Linux
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Locale output on AIX
LANG=en_US
LC_COLLATE="en_US"
LC_CTYPE="en_US"
LC_MONETARY="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_MESSAGES="en_US"
LC_ALL=
一个应用程序将xml发送为<?xml version="1.0" encoding="ISO-8859-1"?>
,另一个应用程序将其发送为<?xml version="1.0">
设置上述JVM设置后,<?xml version="1.0">
被正确处理,但编码设置为ISO-8859-1的那个不正确。我完全迷失在这里。
答案 0 :(得分:0)
由于您似乎没有编写应用程序以使用特定编码,因此使用会话的默认值。
使用locale
检查AIX和Linux上的区域设置。在Linux上,它可能类似于LANG=en_US.UTF-8
。
让您的应用程序在Linux上的行为与在Linux上设置的AIX上的行为相同,语言环境与AIX上的值相同。
一般来说,使用unicode感知应用程序并不是一个坏主意。但是有一些例外情况,你需要坚持另一种编码,例如一些遗留系统的LATIN-1。然后在您的代码中,您明确需要在需要的地方选择此编码。