V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
chopper
V2EX  ›  Java

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

  •  
  •   chopper · Nov 11, 2020 · 4515 views
    This topic created in 2000 days ago, the information mentioned may be changed or developed.

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

    16 replies    2020-11-11 14:08:50 +08:00
    proxychains
        1
    proxychains  
       Nov 11, 2020 via Android
    encode
    Cbdy
        2
    Cbdy  
       Nov 11, 2020 via Android
    这个表述。。。你还是说一下原始需求吧
    chopper
        3
    chopper  
    OP
       Nov 11, 2020
    @Cbdy 要把中文转换成 GBK 编码。
    xiangyuecn
        4
    xiangyuecn  
       Nov 11, 2020   ❤️ 1
    new String(unicode.getBytes("utf-8") ,"gbk")
    Cbdy
        5
    Cbdy  
       Nov 11, 2020 via Android
    @chopper 中文本来就可以用 GBK 存储,为什么要转?
    chopper
        6
    chopper  
    OP
       Nov 11, 2020
    @xiangyuecn String unicode = “中文”; 打印出来的结果是:涓枃, 打开文件显示 娑擃厽鏋�
    看上去是错的
    SkyLine7
        7
    SkyLine7  
       Nov 11, 2020
    new String(new String(unicode.getBytes("utf-8"),"iso-8859-1").getBytes("iso-8859-1"),"gbk");
    chopper
        8
    chopper  
    OP
       Nov 11, 2020
    @Cbdy 但是 Java 默认是 unicode,如果不转成 GBK 的话,服务器端用 GBK 打开文件看到的就是乱码。服务器强制上传文件格式为 GBK 。
    zcqshine
        9
    zcqshine  
       Nov 11, 2020
    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  
       Nov 11, 2020   ❤️ 1
    String 就只是 String,Java 没定义 String 一定要什么编码存储,你要想输出 GBK 编码,就要在输出为二进制的时候转,例如
    OutputStreamWriter(OutputStream out, String charsetName) 中指定 charsetName 为"gbk"
    或者
    getBytes(String charsetName)中指定 charsetName 为"gbk"
    Cbdy
        11
    Cbdy  
       Nov 11, 2020
    @chopper 首先,Unicode 和 GBK 是两种不同的东西,前者是字符集,后者是具体编码;其次,Java 虚拟机对 java.lang.String 的处理用的是 UTF16,但是你大多数时候不用关心,因为 String 类屏蔽了大多数底层的细节

    你的需求很简单,就是把一个字符串保存为 GBK 的文本。那你写文件流的时候指定一下二进制的编码,如 GBK 就可以了
    auin
        12
    auin  
       Nov 11, 2020
    4 楼正确
    qwerthhusn
        13
    qwerthhusn  
       Nov 11, 2020
    str.getBytes("GBK")
    fangcan
        14
    fangcan  
       Nov 11, 2020
    new String(unicode.getBytes("gbk") ,"gbk")
    daiqiangbudainiu
        15
    daiqiangbudainiu  
       Nov 11, 2020
    GBK 是 Unicode 的一种具体实现
    palmers
        16
    palmers  
       Nov 11, 2020
    将内容写入的时候指定编码为 GBK 然后读取的时候按照 GBK 读取就可以了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2714 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 13:14 · PVG 21:14 · LAX 06:14 · JFK 09:14
    ♥ Do have faith in what you're doing.