package org.java_websocket.util;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
import org.java_websocket.exceptions.InvalidDataException;
import org.java_websocket.framing.CloseFrame;
public class Charsetfunctions {
public static CodingErrorAction codingErrorAction = CodingErrorAction.REPORT;
/*
* @return UTF-8 encoding in bytes
*/
public static byte[] utf8Bytes( String s ) {
try {
return s.getBytes( "UTF8" );
} catch ( UnsupportedEncodingException e ) {
throw new RuntimeException( e );
}
}
/*
* @return ASCII encoding in bytes
*/
public static byte[] asciiBytes( String s ) {
try {
return s.getBytes( "ASCII" );
} catch ( UnsupportedEncodingException e ) {
throw new RuntimeException( e );
}
}
public static String stringAscii( byte[] bytes ) {
return stringAscii( bytes, 0, bytes.length );
}
public static String stringAscii( byte[] bytes, int offset, int length ){
try {
return new String( bytes, offset, length, "ASCII" );
} catch ( UnsupportedEncodingException e ) {
throw new RuntimeException( e );
}
}
public static String stringUtf8( byte[] bytes ) throws InvalidDataException {
return stringUtf8( ByteBuffer.wrap( bytes ) );
}
/*public static String stringUtf8( byte[] bytes, int off, int length ) throws InvalidDataException {
CharsetDecoder decode = Charset.forName( "UTF8" ).newDecoder();
decode.onMalformedInput( codingErrorAction );
decode.onUnmappableCharacter( codingErrorAction );
//decode.replaceWith( "X" );
String s;
try {
s = decode.decode( ByteBuffer.wrap( bytes, off, length ) ).toString();
} catch ( CharacterCodingException e ) {
throw new InvalidDataException( CloseFrame.NO_UTF8, e );
}
return s;
}*/
public static String stringUtf8( ByteBuffer bytes ) throws InvalidDataException {
CharsetDecoder decode = Charset.forName( "UTF8" ).newDecoder();
decode.onMalformedInput( codingErrorAction );
decode.onUnmappableCharacter( codingErrorAction );
// decode.replaceWith( "X" );
String s;
try {
bytes.mark();
s = decode.decode( bytes ).toString();
bytes.reset();
} catch ( CharacterCodingException e ) {
throw new InvalidDataException( CloseFrame.NO_UTF8, e );
}
return s;
}
public static void main( String[] args ) throws InvalidDataException {
stringUtf8( utf8Bytes( "\0" ) );
stringAscii( asciiBytes( "\0" ) );
}
}