robbin,问一个字符集的问题

03-08-14 zmeng
我通过socket连接到一个认证网关获取信息,网关返回的信息如下

echo: Serial=106082379178670

echo: Family=3

echo: Cat=4

echo: Act=6

echo: Verify=80

echo: 88806756@XXXXXXXXXX|0|测试ing|20|1|0000|中国|北京市|东城区|||||||||0|||0|0|||||1

其中Verify的值是最后一条信息的长度,我通过判断收到每行信息的长度是否等于Verify的值,从而知道已经收到了全部信息,退出循环,关闭socket连接。

部分代码如下:

echoSocket = new Socket("XXX.XXX.XXX.XXX", XXXX);

out = new PrintWriter(echoSocket.getOutputStream(), true);

in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));

out.println(getUser);

while ( (echooutput = in.readLine()) != null) {

if (echooutput.indexOf("Verify") != -1)

Verify = Integer.parseInt(echooutput.substring(7, echooutput.length()));

if (Verify == new String(echooutput.getBytes(), "ISO8859_1").length()) {

reStr = echooutput;

break;

}

}

out.close();

in.close();

echoSocket.close();

....

原来程序在windows环境下没问题,现在我们要把应用转到linux下,就不行了,帮忙看看是怎麽回事?难道字符集和操作系统有关系吗?谢谢了!

robbin
2003-08-14 10:01
Java内部对字符串处理统一用UTF-8,从外部读入的字符将根据操作系统的字符集编码进行转换到UTF-8上;向外部输出字符串的时候,将UTF-8字符串向操作系统的编码转换,然后输出。

如果你的Linux支持GBK字符集或者GB2312字符集,最简单的解决办法是修改Linux默认字符集设定。

Bash:

export LANG=zh_CN.GBK

java ......

C shell:

set LANG zh_CN.GBK

java ......

如果Linux不支持中文,那么输出字符串总归都是乱码,不过可以保证字符串正常转换,修改以下行:

in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));

--->

in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream(),"GBK"));

out = new PrintWriter(echoSocket.getOutputStream(), true);

--->

out = new PrintWriter(new OutputStreamWriter(echoSocket.getOutputStream(),"GBK"), true);

zmeng
2003-08-14 10:32
多谢robbin!

我把程序修改了一下

echoSocket = new Socket("XXX.XXX.XXX.XXX", XXXX);

out = new PrintWriter(echoSocket.getOutputStream(), true);

in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream(),"ISO-8859-1"));

out.println(getUser);

while ( (echooutput = in.readLine()) != null) {

if (echooutput.indexOf("Verify") != -1)

Verify = Integer.parseInt(echooutput.substring(7, echooutput.length()));

if (Verify == echooutput.length()){

reStr = echooutput;

break;

}

}

out.close();

in.close();

echoSocket.close();

在win和linux下都可以了

可是我不明白我用

new String(echooutput.getBytes(), "ISO-8859-1").length()

为什麽不可以?

还有linux和mysql的字符集在什麽地方改?我的一些静态页面在win下显示正常,而在linux下显示乱吗,但jsp就没事?

ISO-8859-1如何转化为中文?

关于字符集的写法ISO-8859-1,8859_1,GB2312,bg2312是不是对写法要求不严格?

另外你写的关于字符集的文章在什麽地方,我找不到。

:)不好意思,一口气有问了这麽多,希望不要烦,谢谢了!

robbin
2003-08-14 11:24
>>new String(echooutput.getBytes(), "ISO-8859-1").length()

GBK编码字符串转换成为ISO-8859-1字节长度会有变化(具体来说,会缩短)

>>还有linux和mysql的字符集在什麽地方改?

你大概对Linux不熟,如果你希望只对Java程序修改操作系统字符集设定,写一个shell脚本,在启动Java程序之前修改LANG环境变量就可以了,例如:

run.sh

#!/bin/sh

export LANG=zh_CN.GBK

export CLASSPATH=...

export PATH=/usr/java/bin:$PATH

java .......

然后chmod a+x run.sh

运行:

./run.sh

如果对登陆用户修改操作系统字符集设定,那么在login脚本里面修改,也可以在系统环境变量设定文件里面修改(不同的Linux发行,文件名称不一样)

在Linux上,修改MySQL数据库字符集是你编译MySQL之前,configure的时候设定的,例如:

./configure --with-charset=GBK

但一般来说,你不需要管MySQL数据库字符集设定,需要注意的是JDBC连接的设定,例如URL:

jdbc:mysql://localhost/hibernate?useUnicode=true&characterEncoding=GBK

>>我的一些静态页面在win下显示正常,而在linux下显示乱吗,但jsp就没事?

不知道你是否用apache2作为Web Server,如果是的话,需要修改httpd.conf关于字符集的设定。这个问题大概和Web Server的配置有关。

>>ISO-8859-1如何转化为中文?

不懂你的意思

>>关于字符集的写法ISO-8859-1,8859_1,GB2312,gb2312是不是对写法要求不严格?

JDK要求不严格,但是有的App Server有严格要求,所以最好规范点。

>>另外你写的关于字符集的文章在什麽地方,我找不到。

没有写完,写完会投稿,也许会投程序员杂志。

猜你喜欢