String str = "感谢国家";     //从linux上的文本中读到的一行
int index = str.indexOf("国");
类似这样的代码在windows平台上对的,在linux平台上index=-1,怎么解决?

解决方案 »

  1.   

    你的文本文档是GBK编码吧? java默认使用系统的默认编码去读文本文件(如果你没有指定编码),中文windows的默认编码是GBK,而中文linux的默认编码是UTF-8.你的程序在linux中运行的时候,使用utf-8编码读取了GBK编码的文本文件,乱码了。在这堆乱码里找不到国字的解决方法:
      1.将文本文件令存为utf-8编码
        2.修改程序,不要使用系统默认的文件编码
        3.修改linux系统的默认编码为GBK
        4.在运行程序的时候,加上 -Dfile.encoding=GBK 参数,显示指定jvm的默认编码为GBK(jvm不获取系统默认编码为自己的编码)
        例如:java -cp . -Dfile.encoding=GBK test.HelloWorld
      

  2.   

    int index = str.indexOf("\u56FD");
    是这样么 不行
      

  3.   

    转换成Unicode码再比较看行不行为了这个问题,还得重启去linux。。我比较懒。。
      

  4.   

    "感谢国家" 和 “国”都unicode再比吗?
      

  5.   

    楼主看了我的回帖了吗? 
    你的文本文件是什么编码?
    你的linux系统默认使用什么编码?
    你有没有对编码作什么特别设置? 
      

  6.   

    你先试试在英文字符串中查找子字符串看有问题没如果没问题基本上可以确定是编码问题是编码问题的话,你就给他换个编码方式试试。比如原来是GB2312的,你就换成utf8的试试。方法:
    str = new String(str.getBytes(),"utf-8");
    试试吧。
      

  7.   

    文本文件是ansi的
    linux应该默认utf-8的
    我没作特别设置
      

  8.   

    找英文字符串okstr = new String(str.getBytes(),"utf-8");
    int index = str.indexOf("年"); 不行int index = str.indexOf(new String(“年”.getBytes(),"utf-8"); 也不行
      

  9.   


    文本文件是windows下生成的?记事本显示ansi,其实就是GBK.linux的编码肯定不是GBK,你回头看看我3楼的回复吧? 最快的解决方法就是:-Dfile.encoding=GBK
      

  10.   

    有什么办法在程序运行时看到str的编码格式吗 
    因为蛮奇怪的 我用logger.info(str);能在linux端看到中文
    随便logger.info("测试");看到是??
      

  11.   


    你的意思是: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());
    }
    }
      

  12.   


    谢谢回复哦文本文件是linux端的系统日志,我拿到windows上打开另存为看到ansi,linux没人说是gbk,项目是sap nwds平台的portal application开发,直接deploy到服务器了,不知道怎么用你的最快解决方法。
      

  13.   


    不是这个意思 服务器jvm是1.4的
      

  14.   


    int index = str.indexOf(new String(str.getBytes("gbk"),"gbk")); 试试
      

  15.   


    OK,文本文件的编码是GBK已经确认无疑。因为“我拿到windows上打开另存为看到ansi”。你的java程序是如何运行的?如果你是这样运行的:java com.xxx.yyy.Test
    你就改成: “java -Dfile.encoding=GBK com.xxx.yyy.Test" 来运行 总之,就是在执行java的命令的时候,添加一个参数"-Dfile.encoding=GBK"
      

  16.   


    int index = str.indexOf(new String(“国”.getBytes("gbk"),"gbk"));  不行
      

  17.   


    是直接部署到j2ee容器上去的,比如说tomcat,怎么加命令啊
      

  18.   


    这样得行: 
    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
      

  19.   

    String str2=new String(str.getBytes("gbk"),"gbk");
    int index=str2.indexOf("国");
      

  20.   


    其他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问题的)
      

  21.   

    aray@aray:~/Download/apache-tomcat-6.0.20/bin$ pwd
    /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
      

  22.   

    String str = "感谢国家"; //从linux上的文本中读到的一行
    int index = str.indexOf("国");
    很明显,在 Linux 上读到的并不是这样一个字符串。你是怎么读的?那个文件的编码是什么?
      

  23.   


    试过了 不行 查看linux默认字符的命令跑不动 用 env |grep LANG 看到
    NLS_LANG=AMERICAN_AMERICA.UTF8
      

  24.   

    我估计你的源文件是 GBK 编码的。在 InputStreamReader 构造上加上 GBK 字符串:BufferedReader br = null;try {
        br = new BufferedReader(new InputStreamReader(new FileInputStream("xxxxx"), "gbk"));
        ...
      

  25.   

    容器不是tomcat 是sap的j2ee engine 
      

  26.   

    String str2=new String(str.getBytes("gbk"),"gbk");
    int index=str2.indexOf("国");
      

  27.   


    你这个系统设置比较奇怪。你看我的: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的值是什么
      

  28.   


    哈哈 解决啦 开心啊 可以回家了 用的是bao兄弟的这个方法,bao兄弟真厉害啊,我回去要补补课了,流方面的api真的不熟啊,感谢给我回复的每一位朋友!!
      

  29.   

    ArayChou 10分
    bao110908 30分
      

  30.   


    这个这个,我刚才说的加-Dfile.encoding的方法已经不能用。
    因为,你们的系统肯定已经加过了你把我刚才那个得到所有jvm属性的代码,修改下放在jsp里执行,得到你现在系统使用的文件编码。你知道了文件的编码,又知道了jvm的默认编码。我相信你知道该如何处理了。