String.indexOf(中文)在linux上碰到的问题

samsongbest 2010-04-28 06:09:14
String str = "感谢国家"; //从linux上的文本中读到的一行
int index = str.indexOf("国");
类似这样的代码在windows平台上对的,在linux平台上index=-1,怎么解决?
...全文
给本帖投票
1075 38 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnmmbd 2010-04-29
  • 打赏
  • 举报
回复
学习
ArayChou 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 samsongbest 的回复:]

容器不是tomcat 是sap的j2ee engine
[/Quote]

这个这个,我刚才说的加-Dfile.encoding的方法已经不能用。
因为,你们的系统肯定已经加过了

你把我刚才那个得到所有jvm属性的代码,修改下放在jsp里执行,得到你现在系统使用的文件编码。

你知道了文件的编码,又知道了jvm的默认编码。我相信你知道该如何处理了。
samsongbest 2010-04-28
  • 打赏
  • 举报
回复
ArayChou 10分
bao110908 30分
samsongbest 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 bao110908 的回复:]
我估计你的源文件是 GBK 编码的。在 InputStreamReader 构造上加上 GBK 字符串:


Java code
BufferedReader br = null;

try {
br = new BufferedReader(new InputStreamReader(new FileInputStream("xxxxx"), "gbk"));
.……
[/Quote]

哈哈 解决啦 开心啊 可以回家了 用的是bao兄弟的这个方法,bao兄弟真厉害啊,我回去要补补课了,流方面的api真的不熟啊,感谢给我回复的每一位朋友!!
ArayChou 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 samsongbest 的回复:]
试过了 不行 查看linux默认字符的命令跑不动 用 env |grep LANG 看到
NLS_LANG=AMERICAN_AMERICA.UTF8
[/Quote]

你这个系统设置比较奇怪。你看我的:

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的值是什么
zfq642773391 2010-04-28
  • 打赏
  • 举报
回复
String str2=new String(str.getBytes("gbk"),"gbk");
int index=str2.indexOf("国");
samsongbest 2010-04-28
  • 打赏
  • 举报
回复
容器不是tomcat 是sap的j2ee engine
  • 打赏
  • 举报
回复
我估计你的源文件是 GBK 编码的。在 InputStreamReader 构造上加上 GBK 字符串:

BufferedReader br = null;

try {
br = new BufferedReader(new InputStreamReader(new FileInputStream("xxxxx"), "gbk"));
...
samsongbest 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 araychou 的回复:]
引用 23 楼 samsongbest 的回复:
int index = str.indexOf(new String(“国”.getBytes("gbk"),"gbk")); 不行


这样得行:


Java code

String str = "感谢国家"; //从linux上的文本中读到的一行
str=new String(str.getBytes("utf-8")……
[/Quote]

试过了 不行 查看linux默认字符的命令跑不动 用 env |grep LANG 看到
NLS_LANG=AMERICAN_AMERICA.UTF8
  • 打赏
  • 举报
回复
String str = "感谢国家"; //从linux上的文本中读到的一行
int index = str.indexOf("国");


很明显,在 Linux 上读到的并不是这样一个字符串。

你是怎么读的?那个文件的编码是什么?
ArayChou 2010-04-28
  • 打赏
  • 举报
回复
aray@aray:~/Download/apache-tomcat-6.0.20/bin$ pwd
/home/aray/Download/apache-tomcat-6.0.20/bin

aray@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.sh

aray@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.sh

aray@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

ArayChou 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 samsongbest 的回复:]
是直接部署到j2ee容器上去的,比如说tomcat,怎么加命令啊
[/Quote]

其他j2ee容器没有用过,tomcat可以这样用:
(干净的tomcat,没有修改过里面文件的)

在$TOMCAT_HOME/bin目录下,新建一个文件setenv.sh,把它加上执行权限。编辑里面的内容,为:

#!/bin/sh

JAVA_OPTS=" -Xmx2048m -Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Djava.awt.headless=true "
export JAVA_OPTS


其中,要解决你的问题的是-Dfile.encoding=GBK, 其他选项是解决其他问题的。(-Xmx2048m解决outofMemory问题的)
zfq642773391 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 samsongbest 的回复:]
引用 20 楼 zfq642773391 的回复:
Java code

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


试试


int index = str.indexOf(new String(“国”.getBytes("gbk"),"gbk")); 不行
[/Quote]
String str2=new String(str.getBytes("gbk"),"gbk");
int index=str2.indexOf("国");
ArayChou 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 samsongbest 的回复:]
int index = str.indexOf(new String(“国”.getBytes("gbk"),"gbk")); 不行
[/Quote]

这样得行:


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

samsongbest 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 araychou 的回复:]
引用 18 楼 samsongbest 的回复:谢谢回复哦

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


OK,文本文件的编码是GBK已经确认无疑。因为“我拿到windows上打开另存为看到an……
[/Quote]

是直接部署到j2ee容器上去的,比如说tomcat,怎么加命令啊
samsongbest 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zfq642773391 的回复:]
Java code

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


试试
[/Quote]

int index = str.indexOf(new String(“国”.getBytes("gbk"),"gbk")); 不行
ArayChou 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zfq642773391 的回复:]

Java code

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


试试
[/Quote]

这个不用试了,肯定不得行!
ArayChou 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 samsongbest 的回复:]谢谢回复哦

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

OK,文本文件的编码是GBK已经确认无疑。因为“我拿到windows上打开另存为看到ansi”。

你的java程序是如何运行的?

如果你是这样运行的:java com.xxx.yyy.Test
你就改成: “java -Dfile.encoding=GBK com.xxx.yyy.Test" 来运行

总之,就是在执行java的命令的时候,添加一个参数"-Dfile.encoding=GBK"
zfq642773391 2010-04-28
  • 打赏
  • 举报
回复

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

试试
samsongbest 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 araychou 的回复:]
引用 15 楼 samsongbest 的回复:

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


你的意思是:jvm默认使用的编码是什么吧?

运行这个,万无一失! 看看输出里面的file.encoding

Java code

/**……
[/Quote]

不是这个意思 服务器jvm是1.4的
加载更多回复(18)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部