java按字节拆分字符串 后在拼成字符串

 Try_he伊 发布于 2022-11-06 01:48

是这样的一个方法

public static String[] splitByByteSize(String content, int size){
    byte[] bytes = content.getBytes();
    int totalSize = bytes.length;
    int partNum = 0;
    if(totalSize == 0){
        return new String[0];
    }
    if(totalSize % size == 0){
        partNum = totalSize / size;
    }else{
        partNum = totalSize / size + 1;
    }
    String[] arr = new String[partNum];
    int arrIndex = -1;
    for(int i=0;i

按字节拆分后等字节的放到String数组中。另外有个方法接收String数组后在拼成content原来的值。现在是如果有中文,按字节拆分会有乱码。但是感觉后面按照String数组拼成字符串应该不会乱码。但是还是乱码。请问怎么做才能在用返回的String数组拼成字符串不乱码。

public static void main(String[] args) throws UnsupportedEncodingException {
    String arr[] = splitByByteSize("abc刘defghijklmnopqrstuvwxyz",4);
    int byteLen = 0;
    for(int i=0;i>"+new String(bytes));
}

public static String[] splitByByteSize(String content, int size) throws UnsupportedEncodingException{
    byte[] bytes = content.getBytes("utf-8");
    int totalSize = bytes.length;
    int partNum = 0;
    if(totalSize == 0){
        return new String[0];
    }
    if(totalSize % size == 0){
        partNum = totalSize / size;
    }else{
        partNum = totalSize / size + 1;
    }
    String[] arr = new String[partNum];
    int offset = 0;
    byte newBytes[] = new byte[size];
    for(int i=0;i

上面是新代码,但是还有有乱码

3 个回答
  • 楼上正解

    2022-11-11 00:50 回答
  • 楼主, java里字符串不能这么乱搞的啊.

    比方说, 一个汉字, 内码unicode转utf8, 三个字节a,b,c, 那么你去按两个字节(ab), 一个字节(c)这样来解码utf8到unicode, 得到的是两个 "replacement character �", 信息在这里丢失了

    写个test给你吧.

    @Test
    public void fdfa() throws Exception{
        byte[] bytes="中".getBytes("utf8");
        System.out.println(bytes.length);  //3
        byte[] b=new byte[2];
        System.arraycopy(bytes, 0, b, 0, 2);
        String s=new String(b,"utf8"); // s为�
        System.out.println(s); //打印?
    }
    

    具体原因呢, 得看一下utf8的编码: http://en.wikipedia.org/wiki/UTF-8

    对于三字节的编码来说, 是这个样子的: 1110xxxx 10xxxxxx 10xxxxxx 你只给了1110xxxx 10xxxxxx, java表示很无力, 没办法解码utf8, 所以就给了一个�.

    总结一下, 一定按编码格式去 正确 编解码. 否则信息会丢失!

    2022-11-11 00:54 回答
    • 首先,将string转换成byte流的时候,一定要指定编码(content.getBytes(utf-8)),否则在传输的时候,很有可能就是个杯具;
    • 其次,arr[arrIndex]+=((char)bytes[i])这个代码,在Java里面可以通过+=运算符将string和char相加?
    • 同上代码,对于双字节编码(例如中文),bytes[i]可能会是一个负数,强制转型成char,由于char的取值范围是0〜(2^16)-1,故此时会转换成一个正值,这样拆分后必然出现乱码,而且这个转换不一定是可逆的,此时再也无法由char恢复byte了,所以拆分后自然无法恢复。

    解决办法:如果是要跨JVM传输,建议直接传输byte数组,然后重组;如果不跨JVM传输,可先重组成string,然后传输,不过不是特殊需要,还是建议传输byte数组,最终在接收端重组。在这个过程中,有一点切记:转换过程中务必指定编码。这是我们项目组血的教训,后来重申的重要原则之一。

    byte[] array = content.getBytes("utf-8");    // 发送端
    String content = new String(array, "utf-8");   // 接收端
    
    2022-11-11 00:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有