Base64 Chinese code scrambling solution

Keywords: Windows Java encoding network

1. What is base64 encoding

Due to the limitations of some network communication protocols, you must use the window.btoa() method to encode the original data before sending. The receiver uses the method equivalent to window.atob() to decode the received base64 data and get the original data. For example, some data containing control characters between 0 and 31 in the ASCII code table is sent.

However, windows.btoa and windows.atob do not support Chinese. After the unicode characters are base64 encoded, the Chinese code will be scrambled through the browser's native btoa method interface.

2. Solutions to the Chinese garbled code of base64 in JS

Code
window.btoa(encodeURIComponent( escape( str )))
Decode
unescape(decodeURIComponent(window.atob( str )))

3. Decoding method in Java

1.escape
Code
public static String escape(String src) {  
    int i;  
    char j;  
    StringBuffer tmp = new StringBuffer();  
    tmp.ensureCapacity(src.length() * 6);  
    for (i = 0; i < src.length(); i++) {  
        j = src.charAt(i);  
        if (Character.isDigit(j) || Character.isLowerCase(j)  
                || Character.isUpperCase(j))  
            tmp.append(j);  
        else if (j < 256) {  
            tmp.append("%");  
            if (j < 16)  
                tmp.append("0");  
            tmp.append(Integer.toString(j, 16));  
        } else {  
            tmp.append("%u");  
            tmp.append(Integer.toString(j, 16));  
        }  
    }  
    return tmp.toString();  
}  
Decode
public static String unescape(String src) {  
    StringBuffer tmp = new StringBuffer();  
    tmp.ensureCapacity(src.length());  
    int lastPos = 0, pos = 0;  
    char ch;  
    while (lastPos < src.length()) {  
        pos = src.indexOf("%", lastPos);  
        if (pos == lastPos) {  
            if (src.charAt(pos + 1) == 'u') {  
                ch = (char) Integer.parseInt(src  
                        .substring(pos + 2, pos + 6), 16);  
                tmp.append(ch);  
                lastPos = pos + 6;  
            } else {  
                ch = (char) Integer.parseInt(src  
                        .substring(pos + 1, pos + 3), 16);  
                tmp.append(ch);  
                lastPos = pos + 3;  
            }  
        } else {  
            if (pos == -1) {  
                tmp.append(src.substring(lastPos));  
                lastPos = src.length();  
            } else {  
                tmp.append(src.substring(lastPos, pos));  
                lastPos = pos;  
            }  
        }  
    }  
    return tmp.toString();  
}  

2. decodeURIComponent

Decode
String result = new java.net.URI(encodeString).getPath()

Posted by nigaki on Thu, 26 Dec 2019 14:40:32 -0800