String str = "感谢国家"; //从linux上的文本中读到的一行
int index = str.indexOf("国");
类似这样的代码在windows平台上对的,在linux平台上index=-1,怎么解决?
int index = str.indexOf("国");
类似这样的代码在windows平台上对的,在linux平台上index=-1,怎么解决?
1.将文本文件令存为utf-8编码
2.修改程序,不要使用系统默认的文件编码
3.修改linux系统的默认编码为GBK
4.在运行程序的时候,加上 -Dfile.encoding=GBK 参数,显示指定jvm的默认编码为GBK(jvm不获取系统默认编码为自己的编码)
例如:java -cp . -Dfile.encoding=GBK test.HelloWorld
是这样么 不行
你的文本文件是什么编码?
你的linux系统默认使用什么编码?
你有没有对编码作什么特别设置?
str = new String(str.getBytes(),"utf-8");
试试吧。
linux应该默认utf-8的
我没作特别设置
int index = str.indexOf("年"); 不行int index = str.indexOf(new String(“年”.getBytes(),"utf-8"); 也不行
文本文件是windows下生成的?记事本显示ansi,其实就是GBK.linux的编码肯定不是GBK,你回头看看我3楼的回复吧? 最快的解决方法就是:-Dfile.encoding=GBK
因为蛮奇怪的 我用logger.info(str);能在linux端看到中文
随便logger.info("测试");看到是??
你的意思是:jvm默认使用的编码是什么吧? 运行这个,万无一失! 看看输出里面的file.encoding/**
* @author Aray Chou
* Email: Aray(dot)Chou(dot)CN(at)gmail(dot)com
* Replace "(dot)" with "." and replace "(at)" with "@"
*/
package com.aray;/**
* 输出jvm的所有系统属性
*/
public class SystemProperties
{ public static void main(String[] args)
{
for (Object a : System.getProperties().entrySet())
System.out.println(a.toString());
}
}
谢谢回复哦文本文件是linux端的系统日志,我拿到windows上打开另存为看到ansi,linux没人说是gbk,项目是sap nwds平台的portal application开发,直接deploy到服务器了,不知道怎么用你的最快解决方法。
不是这个意思 服务器jvm是1.4的
int index = str.indexOf(new String(str.getBytes("gbk"),"gbk")); 试试
OK,文本文件的编码是GBK已经确认无疑。因为“我拿到windows上打开另存为看到ansi”。你的java程序是如何运行的?如果你是这样运行的:java com.xxx.yyy.Test
你就改成: “java -Dfile.encoding=GBK com.xxx.yyy.Test" 来运行 总之,就是在执行java的命令的时候,添加一个参数"-Dfile.encoding=GBK"
int index = str.indexOf(new String(“国”.getBytes("gbk"),"gbk")); 不行
是直接部署到j2ee容器上去的,比如说tomcat,怎么加命令啊
这样得行:
String str = "感谢国家"; //从linux上的文本中读到的一行
str=new String(str.getBytes("utf-8"),"gbk");
int index = str.indexOf("国");
前提是你的linux确实使用utf-8编码
查看linux编码:aray@aray:~$ echo $LANG
zh_CN.UTF-8
int index=str2.indexOf("国");
其他j2ee容器没有用过,tomcat可以这样用:
(干净的tomcat,没有修改过里面文件的)在$TOMCAT_HOME/bin目录下,新建一个文件setenv.sh,把它加上执行权限。编辑里面的内容,为:
#!/bin/shJAVA_OPTS=" -Xmx2048m -Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Djava.awt.headless=true "
export JAVA_OPTS
其中,要解决你的问题的是-Dfile.encoding=GBK, 其他选项是解决其他问题的。(-Xmx2048m解决outofMemory问题的)
/home/aray/Download/apache-tomcat-6.0.20/binaray@aray:~/Download/apache-tomcat-6.0.20/bin$ echo '#!/bin/bash' > setenv.sh
aray@aray:~/Download/apache-tomcat-6.0.20/bin$ echo 'JAVA_OPTS=" -Xmx2048m -Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Djava.awt.headless=true "' >> setenv.sh
aray@aray:~/Download/apache-tomcat-6.0.20/bin$ echo 'export JAVA_OPTS' >> setenv.sharay@aray:~/Download/apache-tomcat-6.0.20/bin$ chmod +x setenv.sh aray@aray:~/Download/apache-tomcat-6.0.20/bin$ ls -l setenv.sh
-rwxr-xr-x 1 aray aray 135 04-28 20:00 setenv.sharay@aray:~/Download/apache-tomcat-6.0.20/bin$ cat setenv.sh
#!/bin/bash
JAVA_OPTS=" -Xmx2048m -Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Djava.awt.headless=true "
export JAVA_OPTS
int index = str.indexOf("国");
很明显,在 Linux 上读到的并不是这样一个字符串。你是怎么读的?那个文件的编码是什么?
试过了 不行 查看linux默认字符的命令跑不动 用 env |grep LANG 看到
NLS_LANG=AMERICAN_AMERICA.UTF8
br = new BufferedReader(new InputStreamReader(new FileInputStream("xxxxx"), "gbk"));
...
int index=str2.indexOf("国");
你这个系统设置比较奇怪。你看我的:aray@aray:~$ env | grep LANG
LANG=zh_CN.UTF-8
GDM_LANG=zh_CN.UTF-8
这样一来,我前面的假设错误,你的linux编码不是utf-8。而你的系统没有设置LANG这个环境变量,这个环境变量默认是有的。如果手动把这个环境变量删除,我不知道linux会用什么编码作为默认编码。NLS_LANG=AMERICAN_AMERICA.UTF8
这个环境变量是Oracle客户端使用的,和我们讨论的问题没有关系。我给你的那个java代码是jdk1.5的语法,你可以改写为1.4语法的,编译后运行。还是查看file.encoding的值是什么
哈哈 解决啦 开心啊 可以回家了 用的是bao兄弟的这个方法,bao兄弟真厉害啊,我回去要补补课了,流方面的api真的不熟啊,感谢给我回复的每一位朋友!!
bao110908 30分
这个这个,我刚才说的加-Dfile.encoding的方法已经不能用。
因为,你们的系统肯定已经加过了你把我刚才那个得到所有jvm属性的代码,修改下放在jsp里执行,得到你现在系统使用的文件编码。你知道了文件的编码,又知道了jvm的默认编码。我相信你知道该如何处理了。