2011-01-17 18 views
9

Ich benutze org.apache.commons.codec.binary.Base64 tun decode Zeichenfolge, die utf8 ist. Manchmal erhalte ich eine Base64-codierte Zeichenfolge, die nach dem Decodieren beispielsweise wie folgt aussieht: ^@k��@@. Wie kann ich überprüfen, ob base64 korrekt ist oder ob decodierte utf8-Zeichenfolge eine gültige utf8-Zeichenfolge ist?Java BASE64 utf8 Zeichenfolge Decodierung

Um zu klären. Ich verwende

public static String base64Decode(String str) { 
    try { 
     return new String(base64Decode(str.getBytes(Constants.UTF_8)), Constants.UTF_8); 
    } catch (UnsupportedEncodingException e) { 
     ... 
    } 
} 

public static byte[] base64Decode(byte[] byteArray) { 
    return Base64.decodeBase64(byteArray); 
} 
+0

Was meinst du mit einem String ist "UTF-8"? Ein String-Objekt kennt keine Kodierungen und Zeichensätze. –

+1

@Michael Konietzka: Ich denke das ist unnötige Nickerchen. Base64 codiert eine Sequenz von Bytes. Ich denke, dass das OP klar sagt, dass die Byte-Folge als die UTF-8-Kodierung einer Unicode-Zeichenfolge angenommen wird ** nicht **, dass ein "java.lang.String" direkt als Base64 kodiert wird (was, wie Sie sagen, nicht würde Sinn machen.) – finnw

+0

@finnw tut mir leid, ich weiß nicht, wie man es klar erklärt. Ich bekomme codierte Zeichenfolge mit Base64 und ich möchte überprüfen, ob es korrekt ist. Ich möchte Situation einfangen, wenn ich base64 codierte Zeichenkette bekomme, die nach der Entschlüsselung wie Müll aussieht, weil alles, was ich erhielt, ein Name sein sollte. – terry207

Antwort

18

Sie die charset während der Umwandlung String zu byte[] und umgekehrt geben sollte.

byte[] bytes = string.getBytes("UTF-8"); 
// feed bytes to Base64 

und

// get bytes from Base64 
String string = new String(bytes, "UTF-8"); 

Andernfalls wird die Plattform Standard-Kodierung verwendet werden, welche nicht notwendigerweise UTF-8 per se ist.

+0

Diese Zeichenfolge sieht nicht so aus, als wenn UTF8 als Einzelbyte-Codierung fehlinterpretiert wird. Kann es GB18030 als UTF8 fehlinterpretiert werden? – finnw

+0

@finnw: Die Antwort geht davon aus, dass die ursprüngliche Zeichenkette *** *** UTF-8 ist, wie vom OP explizit erwähnt. Wenn dies nicht der Fall ist, ist das Problem woanders zu lösen. – BalusC

+0

@BalusC: Was meinst du mit 'ein String ist UTF8'? UTF-8 ist eine Kodierung. –

1

Versuchen Sie folgendes:

var B64 = { 
    alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=', 
    lookup: null, 
    ie: /MSIE /.test(navigator.userAgent), 
    ieo: /MSIE [67]/.test(navigator.userAgent), 
    encode: function (s) { 
     var buffer = B64.toUtf8(s), 
      position = -1, 
      len = buffer.length, 
      nan1, nan2, enc = [, , , ]; 
     if (B64.ie) { 
      var result = []; 
      while (++position < len) { 
       nan1 = buffer[position + 1], nan2 = buffer[position + 2]; 
       enc[0] = buffer[position] >> 2; 
       enc[1] = ((buffer[position] & 3) << 4) | (buffer[++position] >> 4); 
       if (isNaN(nan1)) enc[2] = enc[3] = 64; 
       else { 
        enc[2] = ((buffer[position] & 15) << 2) | (buffer[++position] >> 6); 
        enc[3] = (isNaN(nan2)) ? 64 : buffer[position] & 63; 
       } 
       result.push(B64.alphabet[enc[0]], B64.alphabet[enc[1]], B64.alphabet[enc[2]], B64.alphabet[enc[3]]); 
      } 
      return result.join(''); 
     } else { 
      result = ''; 
      while (++position < len) { 
       nan1 = buffer[position + 1], nan2 = buffer[position + 2]; 
       enc[0] = buffer[position] >> 2; 
       enc[1] = ((buffer[position] & 3) << 4) | (buffer[++position] >> 4); 
       if (isNaN(nan1)) enc[2] = enc[3] = 64; 
       else { 
        enc[2] = ((buffer[position] & 15) << 2) | (buffer[++position] >> 6); 
        enc[3] = (isNaN(nan2)) ? 64 : buffer[position] & 63; 
       } 
       result += B64.alphabet[enc[0]] + B64.alphabet[enc[1]] + B64.alphabet[enc[2]] + B64.alphabet[enc[3]]; 
      } 
      return result; 
     } 
    }, 
    decode: function (s) { 
     var buffer = B64.fromUtf8(s), 
      position = 0, 
      len = buffer.length; 
     if (B64.ieo) { 
      result = []; 
      while (position < len) { 
       if (buffer[position] < 128) result.push(String.fromCharCode(buffer[position++])); 
       else if (buffer[position] > 191 && buffer[position] < 224) result.push(String.fromCharCode(((buffer[position++] & 31) << 6) | (buffer[position++] & 63))); 
       else result.push(String.fromCharCode(((buffer[position++] & 15) << 12) | ((buffer[position++] & 63) << 6) | (buffer[position++] & 63))); 
      } 
      return result.join(''); 
     } else { 
      result = ''; 
      while (position < len) { 
       if (buffer[position] < 128) result += String.fromCharCode(buffer[position++]); 
       else if (buffer[position] > 191 && buffer[position] < 224) result += String.fromCharCode(((buffer[position++] & 31) << 6) | (buffer[position++] & 63)); 
       else result += String.fromCharCode(((buffer[position++] & 15) << 12) | ((buffer[position++] & 63) << 6) | (buffer[position++] & 63)); 
      } 
      return result; 
     } 
    }, 
    toUtf8: function (s) { 
     var position = -1, 
      len = s.length, 
      chr, buffer = []; 
     if (/^[\x00-\x7f]*$/.test(s)) while (++position < len) 
     buffer.push(s.charCodeAt(position)); 
     else while (++position < len) { 
      chr = s.charCodeAt(position); 
      if (chr < 128) buffer.push(chr); 
      else if (chr < 2048) buffer.push((chr >> 6) | 192, (chr & 63) | 128); 
      else buffer.push((chr >> 12) | 224, ((chr >> 6) & 63) | 128, (chr & 63) | 128); 
     } 
     return buffer; 
    }, 
    fromUtf8: function (s) { 
     var position = -1, 
      len, buffer = [], 
      enc = [, , , ]; 
     if (!B64.lookup) { 
      len = B64.alphabet.length; 
      B64.lookup = {}; 
      while (++position < len) 
      B64.lookup[B64.alphabet[position]] = position; 
      position = -1; 
     } 
     len = s.length; 
     while (position < len) { 
      enc[0] = B64.lookup[s.charAt(++position)]; 
      enc[1] = B64.lookup[s.charAt(++position)]; 
      buffer.push((enc[0] << 2) | (enc[1] >> 4)); 
      enc[2] = B64.lookup[s.charAt(++position)]; 
      if (enc[2] == 64) break; 
      buffer.push(((enc[1] & 15) << 4) | (enc[2] >> 2)); 
      enc[3] = B64.lookup[s.charAt(++position)]; 
      if (enc[3] == 64) break; 
      buffer.push(((enc[2] & 3) << 6) | enc[3]); 
     } 
     return buffer; 
    } 
}; 

Ansicht Here

+1

Dieser funktionierte perfekt für mich. Ich verstehe, dass es eine negative Stimme erhielt, weil es eine Javascript-Antwort auf eine Java-Frage ist. –

-1

ich diese Methode erstellt:

public static String descodificarDeBase64(String stringCondificado){ 
    try { 
     return new String(Base64.decode(stringCondificado.getBytes("UTF-8"),Base64.DEFAULT)); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     return ""; 
    } 
} 

So kann ich von Base64 spanisch characthers als á dekodieren, n, i, ü.

Beispiel:

descodificarDeBase64("wr9xdcOpIHRhbD8="); 

zurückkehren wird: ¿Qué tal?

Verwandte Themen