|
|
|
robbin,问一个字符集的问题
|
2003年08月14日 09:22
|
|
|
标签列表
|
|
我通过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下,就不行了,帮忙看看是怎麽回事?难道字符集和操作系统有关系吗?谢谢了!
|
|
|
|
|
|
Re: 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);
|
|
|
|
|
|
Re: robbin,问一个字符集的问题
|
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是不是对写法要求不严格?
另外你写的关于字符集的文章在什麽地方,我找不到。
:)不好意思,一口气有问了这麽多,希望不要烦,谢谢了!
|
|
|
|
|
|
Re: 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有严格要求,所以最好规范点。
>>另外你写的关于字符集的文章在什麽地方,我找不到。 没有写完,写完会投稿,也许会投程序员杂志。
|
|
|
|