不知道为啥当时自己写了一段在手机里用命令行创建文件的代码,后来由于需求,新建的文件夹需要用中文表示,因为直观,然后就发现出现诡异的乱码。
尝试了各种的编码格式,最后终于成功了,上图就是各种编码格式出的岔子,第一个为正确的。
好了不多说了,上源码吧
1 public void ShellONECommand(String cmd) 2 { 3 ((MainActivity)mainContext).ThreadUpdateLogToUI( "RunShell: " + cmd, CommonVar.LOG_SHOW); 4 5 try 6 { 7 Process process = Runtime.getRuntime().exec("su"); 8 DataOutputStream os = new DataOutputStream(process.getOutputStream()); 9 cmd = new String(cmd.getBytes(), "ISO-8859-1"); 10 os.writeBytes(cmd + "\n"); 11 os.writeBytes("exit\n"); 12 os.flush(); 13 os.close(); 14 process.waitFor(); 15 } catch (Exception e) 16 { 17 e.getStackTrace(); 18 } 19 }
上面的代码在使用时候是这样用的:
ShellONECommand("mkdir -p /storage/emulated/0/中文文件夹");
其实上面的代码最关键的部分在于 第9行:
cmd = new String(cmd.getBytes(), "ISO-8859-1");
首先将cmd转化为byte,然后转化为 ISO-8859-1 的编码格式。
其实难点就在于,如果确定是这种编码格式呢?因为之前我觉得Android手机中只会存在utf-8 和 gb2312的编码格式,但是居然出了这么一个奇葩的编码格式。
那以后遇到这样的怎么办呢?那只能一个一个的尝试了,所以列一下常用的编码格式:
/** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */ "US-ASCII"; /** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */ "ISO-8859-1"; /** 8 位 UCS 转换格式 */ "UTF-8"; /** 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 */ "UTF-16BE"; /** 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 */ "UTF-16LE"; /** 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 */ "UTF-16"; /** 中文超大字符集 */ "GBK"
时间: 2024-10-26 11:24:28