public static void main(final String[] args) { final byte[] utf16 = "hello wörld".getBytes(Charset.forName("UTF-16")); final byte[] latin1 = utf16toLatin1(utf16); System.out.println(new String(latin1, Charset.forName("ISO-8859-1"))); } /** Extracts Latin1 text from UTF16 by ignoring every other byte. */ static byte[] utf16toLatin1(final byte[] data) throws IllegalArgumentException { final byte[] result = new byte[data.length / 2]; int order = 0;// Big-Endian int start = 0;// Without BOM if (data[0] == -2 && data[1] == -1) start = 2;// With BOM else if (data[0] == -1 && data[1] == -2) { order = 1;// Little-Endian start = 2;// With BOM } else if (data[0] != 0 && data[1] == 0) order = 1;// Little-Endian for (int i = start; i < data.length; i++) { final byte b = data[i]; if ((i & 1) == order) { if (b != 0) throw new IllegalArgumentException(); continue; } result[i / 2] = data[i]; } return result; }