
我想把一个中文的 String 转换成 GBK 编码,因为 Java 默认编码是 unicode,所以我想 newString(unicode.getBytes("GBK"))应该就可以了。 但是这个方法转换 “中文”后的文件用 GBK 格式打开显示的是: 锟斤拷锟斤拷。 我另外用 iconv 转换的文件用 GBK 格式打开就是正常的。请问这是为什么?/p>
1 proxychains 2020-11-11 09:01:01 +08:00 via Android encode |
2 Cbdy 2020-11-11 09:07:28 +08:00 via Android 这个表述。。。你还是说一下原始需求吧 |
4 xiangyuecn 2020-11-11 09:10:59 +08:00 new String(unicode.getBytes("utf-8") ,"gbk") |
6 chopper OP @xiangyuecn String unicode = “中文”; 打印出来的结果是:涓, 打开文件显示 娑 看上去是错的 |
7 SkyLine7 2020-11-11 09:19:13 +08:00 new String(new String(unicode.getBytes("utf-8"),"iso-8859-1").getBytes("iso-8859-1"),"gbk"); |
8 chopper OP @Cbdy 但是 Java 默认是 unicode,如果不转成 GBK 的话,服务器端用 GBK 打开文件看到的就是乱码。服务器强制上传文件格式为 GBK 。 |
9 zcqshine 2020-11-11 09:24:20 +08:00 public class EncodingUtil { /** * 将原正确编码的字符串 src 转化为 srcCharset 的字符串 * * 前提是: 确保原字符串的编码是无损的(完整的). 无需知道原字符串的具体编码, 转化为目标编码的字符串由 Java 库自动实现,无需自己手动实现. * 如果原字符串不能转化为目标编码,将会抛出 UnsupportedEncodingException * @param src * @param srcCharset * @param destCharset * @return */ public static String convertEncodingString(String src, Charset srcCharset, Charset destCharset){ byte[] bytes = src.getBytes(srcCharset); return new String(bytes, destCharset); } /** * 将编码为 srcCharset 的字节数组 src 转化为编码为 desCharset 的字节数组 * @param src * @param srcCharSet * @param destCharset * @return */ public static byte[] convertEncodingBytes(byte[] src, Charset srcCharSet, Charset destCharset){ String s = new String(src, srcCharSet); return s.getBytes(destCharset); } public static String byteToHex(byte... byteArr){ if (byteArr == null || byteArr.length == 0){ return ""; }else { StringBuilder sb = new StringBuilder(); String tmp = null; for (byte b : byteArr) { tmp = Integer.toHexString(b); //byte 进行运算时,会自动转化为 int,否则可能会出错 if (b >>> 31 == 1) { //最高位为 1, 负数 sb.append(tmp.substring(6)); } else { //最高位为 0,正数 if (tmp.length() < 2){ sb.append('0'); } sb.append(tmp); } sb.append(' '); } //delete last space sb.deleteCharAt(sb.length() - 1); return sb.toString(); } } } |
10 pursuer 2020-11-11 09:24:52 +08:00 String 就只是 String,Java 没定义 String 一定要什么编码存储,你要想输出 GBK 编码,就要在输出为二进制的时候转,例如 OutputStreamWriter(OutputStream out, String charsetName) 中指定 charsetName 为"gbk" 或者 getBytes(String charsetName)中指定 charsetName 为"gbk" |
11 Cbdy 2020-11-11 09:42:02 +08:00 @chopper 首先,Unicode 和 GBK 是两种不同的东西,前者是字符集,后者是具体编码;其次,Java 虚拟机对 java.lang.String 的处理用的是 UTF16,但是你大多数时候不用关心,因为 String 类屏蔽了大多数底层的细节 你的需求很简单,就是把一个字符串保存为 GBK 的文本。那你写文件流的时候指定一下二进制的编码,如 GBK 就可以了 |
12 liuxey 2020-11-11 09:46:02 +08:00 4 楼正确 |
13 qwerthhusn 2020-11-11 09:46:33 +08:00 str.getBytes("GBK") |
14 fangcan 2020-11-11 10:08:17 +08:00 new String(unicode.getBytes("gbk") ,"gbk") |
15 warcraft1236 2020-11-11 10:38:50 +08:00 GBK 是 Unicode 的一种具体实现 |
16 palmers 2020-11-11 14:08:50 +08:00 将内容写入的时候指定编码为 GBK 然后读取的时候按照 GBK 读取就可以了 |