Runtime.getRuntime().exec 命令里有中文,但是执行是乱码的问题

mrtalon 2013-01-22 07:07:12
String command="cd /usr/bin; ./cli map modify_hmap --mname hmaptarget9 --comment \"备注\"";
String[] cmds = { "/bin/sh", "-c", command };
String[] envp = {"LANG=UTF-8"};
Runtime.getRuntime().exec(cmds, envp, null);

以上代码在linux环境下执行,然后查看执行结果发现调用linu的命令时,中文“备注”传进去的是乱码。
我手动输入cd /usr/bin; ./cli map modify_hmap --mname hmaptarget9 --comment "备注"
可以正确执行。
注:
我的JAVA文件编码格式是UTF-8
linux 环境的编码为:LANG="en_US.UTF-8"
我以为是envp 设置的有问题,我就将envp 改为{"LANG=UTF-8"}和{"LANG=en_US.UTF-8"}都不行。


求大牛解决!
...全文
2505 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeebeeee 2013-07-05
  • 打赏
  • 举报
回复
引用 8 楼 mrtalon 的回复:
[quote=引用 7 楼 rainyj 的回复:] 你好啊,我也遇到一样的问题,你解决了吗?
嗨,解决了,我是因为启动java程序的时候,在脚本里设置了运行时编码,将运行时编码改为UTF-8,以前是GBK[/quote] 在脚本里设置了运行是编码?? 怎么设置的?
mrtalon 2013-03-27
  • 打赏
  • 举报
回复
引用 7 楼 rainyj 的回复:
你好啊,我也遇到一样的问题,你解决了吗?
嗨,解决了,我是因为启动java程序的时候,在脚本里设置了运行时编码,将运行时编码改为UTF-8,以前是GBK
rainyj 2013-03-10
  • 打赏
  • 举报
回复
你好啊,我也遇到一样的问题,你解决了吗?
mrtalon 2013-01-29
  • 打赏
  • 举报
回复
我的Xshell编码格式是UTF-8,现在的问题是: 如果我通过Xshell执行设置命令,传入的是中文“备注”,我通过程序执行接收命令(也是用Runtime.getRuntime().exec(cmds, envp, null);),对接受到String,首先对字符串进行ISO-8859-1解码,然后再按UTF-8进行编码,最后能按中文“备注”显示出来。 但是我通过程序Runtime.getRuntime().exec(cmds, envp, null)执行设置命令时,同样的接收过程就是乱码(我试过执行设置命令之前,将命令字符串按照UTF-8解码,再按照ISO-8859-1编码,仍然不行)
lh412552703 2013-01-23
  • 打赏
  • 举报
回复
windows系统都是GBK编码。
IceArmour 2013-01-23
  • 打赏
  • 举报
回复
看下你Linux工具的编码方式,比如XShell,就看下XShell的编码方式
mrtalon 2013-01-23
  • 打赏
  • 举报
回复
引用 1 楼 qunhao 的回复:
Java code?1String[] cmds = { "/bin/sh", "-c", new String(command.getBytes(), "utf-8") }; 试下这个。
多谢,不过试了,没用,执行查看命令,返回的是三个问号"???" 在网上查了资料(http://www.360doc.com/content/12/0420/13/9470897_205152817.shtml) 然后我个人理解的是: new String(command.getBytes(), "utf-8")只对字符串编码再解码,解码后的字符(不管是以UTF-8进行解码还是以GBK进行解码)会转化为unicode进行存储。在jvm内部运行时也是以unicode进行表示。只是在与外界进行交流时(例如读写文件等)才进行编码转换。所以我就在想Runtime.getRuntime().exec执行linux命令的时候是不是在与外界进行交流,如果是这样的话就要指定编码格式。但是现在指定编码格式还是不管用,不知道哪里出了问题?
healer_kx 2013-01-22
  • 打赏
  • 举报
回复
引用 1 楼 qunhao 的回复:
Java code?1String[] cmds = { "/bin/sh", "-c", new String(command.getBytes(), "utf-8") }; 试下这个。
UP
qunhao 2013-01-22
  • 打赏
  • 举报
回复

String[] cmds = { "/bin/sh", "-c", new String(command.getBytes(), "utf-8") };
试下这个。
在线阅读 一、 功能所需工具 下载工具 OpenOffice http://zh.openoffice.org/new/zh_cn/downloads.html JodConverter http://dldx.csdn.net/fd.php?i=992314146801277&s=08dbee95a6e2dda1a95aa8cbf4df197b Swftools(pdf2swf) http://dldx.csdn.net/fd.php?i=389133735472350&s=2f7430ad3c00cca78ada8b4671a50b24 FlexPaper http://flexpaper.googlecode.com/files/FlexPaper_1.4.5_flash.zip 二、 搭建所需环境及实现 第一步:安装OpenOffice。从上述下载地址得到可执行安装文件,直接双击执行,安装过程较为人性化,只需选择下一步即可。此处注意下安装路径,文件转换之前需在Windows命令行窗口打开安装根目录,然后执行开启服务命令。 第二步:解压JodConverter。解压目录结构如下图: 打开lib文件夹, 将其中的jar包复制到Web工程的WebRoot/WEB-INF/lib下。 第三步:安装Swftools。从下载的压缩包中解压得到可执行安装文件,直接双击执行。该转换工具用来将pdf文件转换成swf文件。改工具既可以安装使用实现文件转换,也拷贝安装后Program Files下的Swftools文件夹放到工程中,以绿色软件方式来使用。转换命令将在FileConverterUtil.java中特别指明。 第四步:使用Flexpaper。Flexpaper就是一个播放swf文件的播放器。解压后目录如下: 其中Paper.swf、所有的txt文件、php文件夹和example文件夹都可以删掉。清理完之后,新建readFile.jsp(jsp页面代码在后面附加),然后将flexpaper文件夹拷贝到WebRoot下即可。 FileConverterUtil.java代码如下: package com.sdjt.util; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; /** *

Title:

*

desc: 档案Action类 *

Copyright: Copyright(c)shundesoft 2011

*

company:济南舜德竟天软件有限公司

* @author 温中伟 * @date 2011-10-14 * @version 1.0 * @since */ public class FileConverterUtil{ /** * 实现文件格式转换 * @param sourceFilePath //源文件路径 * @param fullFileName //源文件名称 * @param converterFlag //源文件转换标志 * @throws Exception */ public String convertFile(String sourceFilePath, String fullFileName, String swfToolsPath, String converterFlag) throws Exception{ File sourceFile; //转换源文件 File pdfFile; //PDF媒介文件 File swfFile; //SWF目标文件 File createPath; //创建文件存放目录 Runtime rt; //转换命令执行类 String converFileName = ""; //转换之后的SWF文件名称 String middleFilePath = sourceFilePath.substring(0, sourceFilePath.length()-1); String filePath = (middleFilePath.substring(0, middleFilePath.lastIndexOf("\\"))).substring(0, (middleFilePath.substring(0, middleFilePath.lastIndexOf("\\"))).lastIndexOf("\\")); String fileName = PinYinUtil.getPinYinFirstOrAllLetter(fullFileName.substring(0, fullFileName.lastIndexOf(".")), false)[0]; String fileType = fullFileName.substring(fullFileName.lastIndexOf(".")+1); String folderName = middleFilePath.substring(middleFilePath.lastIndexOf("\\")+1); if(converterFlag.equals("1")){ converFileName = folderName+"/"+fileName+".swf"; }else{ if(fileType.equals("pdf")){ //PDF格式文件处理方式 rt = Runtime.getRuntime(); sourceFile = new File(sourceFilePath+fullFileName); //创建SWF文件存放目录 createPath = new File(filePath+"\\swfFiles\\"+folderName); if(!createPath.isDirectory()){ createPath.mkdir(); } swfFile = new File(filePath+"/swfFiles/"+folderName+"/"+fileName+".swf"); Process p = rt.exec(swfToolsPath+"/pdf2swf.exe " + sourceFile.getPath() + " -o " + swfFile.getPath() + " -T 9"); //缓冲区读入内容清理 clearCache(p.getInputStream(), p.getErrorStream()); converFileName = folderName+"/"+fileName+".swf"; }else{ //非PDF格式文件处理方式 if(isLegal(fileType.toUpperCase())){ sourceFile = new File(sourceFilePath+fullFileName); pdfFile = new File(filePath+"/swfFiles/"+folderName+"/"+fileName+".pdf"); swfFile = new File(filePath+"/swfFiles/"+folderName+"/"+fileName+".swf"); //获取连接对象 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); //取得连接 connection.connect(); //创建文件格式转换对象 DocumentConverter converter = new OpenOfficeDocumentConverter(connection); //实现文件格式转换 converter.convert(sourceFile, pdfFile); //生成已转换的PDF文件 pdfFile.createNewFile(); //释放连接 connection.disconnect(); rt = Runtime.getRuntime(); //执行PDF文件转换成SWF文件命令 Process p = rt.exec(swfToolsPath+"/pdf2swf.exe " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9"); //缓冲区读入内容清理 clearCache(p.getInputStream(), p.getErrorStream()); //删除中转PDF文件 if(pdfFile.exists()){ pdfFile.delete(); } converFileName = folderName+"/"+fileName+".swf"; } } } return converFileName; } /** * 清理缓冲区 * @param isi * @param ise */ public void clearCache(InputStream isi, InputStream ise){ try { final InputStream is1 = isi; //启用单独线程清空InputStream缓冲区 new Thread(new Runnable() { public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(is1)); try { while(br.readLine() != null) ; } catch (IOException e) { e.printStackTrace(); } } }).start(); //读入ErrorStream缓冲 BufferedReader br = new BufferedReader(new InputStreamReader(ise)); //保存缓冲输出结果 StringBuilder buf = new StringBuilder(); String line = null; try { line = br.readLine(); } catch (IOException e) { e.printStackTrace(); } //循环等待进程结束 while(line != null) buf.append(line); is1.close(); ise.close(); br.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 判断所转换文件类型是否合法 * @param getFileType //文件格式 * @param fileLegalFlag //是否合法标志 false:非法 true:合法 */ public boolean isLegal(String getFileType){ boolean fileLegalFlag = false; if(getFileType.equals("TXT")){ fileLegalFlag = true; }else if(getFileType.equals("DOC")||getFileType.equals("DOCX")){ fileLegalFlag = true; }else if(getFileType.equals("PPT")||getFileType.equals("PPTX")){ fileLegalFlag = true; }else if(getFileType.equals("XLS")||getFileType.equals("XLSX")){ fileLegalFlag = true; } return fileLegalFlag; } } readFile.jsp页面代码如下: <%@ page language="java" import="java.lang.String" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String getFilePath = request.getParameter("recFileName"); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html lang="en" xml:lang="en"> <head> <title>在线阅读</title> <style type="text/css" media="screen"> html, body { height:100%; } body { margin:0; padding:0; overflow:auto; } #flashContent { display:none; } </style> [removed][removed] </head> <body>
'), Scale : 0.6, ZoomTransition : 'easeOut', ZoomTime : 0.5, ZoomInterval : 0.2, FitPageOnLoad : true, FitWidthOnLoad : false, PrintEnabled : false, FullScreenAsMaxWindow : false, ProgressiveLoading : true, MinZoomSize : 0.2, MaxZoomSize : 5, SearchMatchAll : false, InitViewMode : 'Portrait', ViewModeToolsVisible : true, ZoomToolsVisible : true, NavToolsVisible : true, CursorToolsVisible : true, SearchToolsVisible : true, localeChain: 'zh_CN' }}); [removed]
</body> </html> Struts配置文件: OpenOffice服务启动命令: cd C:\Program Files\OpenOffice.org 3\program soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard 需注意的问题 转换TXT时内容中文乱码问题 反编译jodconverter-2.2.2.jar,反编译好的已经放在在线阅读文件夹下。Jodconverter-2.2.1.jar不出现TXT乱码问题,但是不支持office2007格式的文件转换。 Flexpaper不支持中文路径 中文名称的文件转换成了汉语拼音.swf 参考资料 http://topic.csdn.net/u/20110712/18/4daf5746-e64e-434d-aeb0-77b05f6c9903.html http://www.cnblogs.com/qinpeifeng107/archive/2011/08/29/2158879.html http://blog.csdn.net/liuyuhua0066/article/details/6603493 http://blog.csdn.net/lyq123333321/article/details/6546104 http://www.cnblogs.com/compass/articles/2046311.html

62,614

社区成员

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

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