请教一下 Java 如何把一个 String 转成 GBK 编码? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chopper
V2EX    Java

请教一下 Java 如何把一个 String 转成 GBK 编码?

  •  
  •   chopper 2020-11-11 09:00:11 +08:00 4289 次点击
    这是一个创建于 1846 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想把一个中文的 String 转换成 GBK 编码,因为 Java 默认编码是 unicode,所以我想 newString(unicode.getBytes("GBK"))应该就可以了。 但是这个方法转换 “中文”后的文件用 GBK 格式打开显示的是: 锟斤拷锟斤拷。 我另外用 iconv 转换的文件用 GBK 格式打开就是正常的。请问这是为什么?/p>

    16 条回复    2020-11-11 14:08:50 +08:00
    proxychains
        1
    proxychains  
       2020-11-11 09:01:01 +08:00 via Android
    encode
    Cbdy
        2
    Cbdy  
       2020-11-11 09:07:28 +08:00 via Android
    这个表述。。。你还是说一下原始需求吧
    chopper
        3
    chopper  
    OP
       2020-11-11 09:10:21 +08:00
    @Cbdy 要把中文转换成 GBK 编码。
    xiangyuecn
        4
    xiangyuecn  
       2020-11-11 09:10:59 +08:00   1
    new String(unicode.getBytes("utf-8") ,"gbk")
    Cbdy
        5
    Cbdy  
       2020-11-11 09:14:06 +08:00 via Android
    @chopper 中文本来就可以用 GBK 存储,为什么要转?
    chopper
        6
    chopper  
    OP
       2020-11-11 09:16:33 +08:00
    @xiangyuecn String unicode = “中文”; 打印出来的结果是:涓, 打开文件显示 娑
    看上去是错的
    SkyLine7
        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");
    chopper
        8
    chopper  
    OP
       2020-11-11 09:20:11 +08:00
    @Cbdy 但是 Java 默认是 unicode,如果不转成 GBK 的话,服务器端用 GBK 打开文件看到的就是乱码。服务器强制上传文件格式为 GBK 。
    zcqshine
        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();

    }
    }

    }
    pursuer
        10
    pursuer  
       2020-11-11 09:24:52 +08:00   1
    String 就只是 String,Java 没定义 String 一定要什么编码存储,你要想输出 GBK 编码,就要在输出为二进制的时候转,例如
    OutputStreamWriter(OutputStream out, String charsetName) 中指定 charsetName 为"gbk"
    或者
    getBytes(String charsetName)中指定 charsetName 为"gbk"
    Cbdy
        11
    Cbdy  
       2020-11-11 09:42:02 +08:00
    @chopper 首先,Unicode 和 GBK 是两种不同的东西,前者是字符集,后者是具体编码;其次,Java 虚拟机对 java.lang.String 的处理用的是 UTF16,但是你大多数时候不用关心,因为 String 类屏蔽了大多数底层的细节

    你的需求很简单,就是把一个字符串保存为 GBK 的文本。那你写文件流的时候指定一下二进制的编码,如 GBK 就可以了
    liuxey
        12
    liuxey  
       2020-11-11 09:46:02 +08:00
    4 楼正确
    qwerthhusn
        13
    qwerthhusn  
       2020-11-11 09:46:33 +08:00
    str.getBytes("GBK")
    fangcan
        14
    fangcan  
       2020-11-11 10:08:17 +08:00
    new String(unicode.getBytes("gbk") ,"gbk")
    warcraft1236
        15
    warcraft1236  
       2020-11-11 10:38:50 +08:00
    GBK 是 Unicode 的一种具体实现
    palmers
        16
    palmers  
       2020-11-11 14:08:50 +08:00
    将内容写入的时候指定编码为 GBK 然后读取的时候按照 GBK 读取就可以了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5123 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:24 PVG 09:24 LAX 17:24 JFK 20:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86