DulcetAirman icon

UTF-16 to Latin-1

DulcetAirman | PRO | 04/14/14 10:33:48 AM UTC | 0 ⭐ | 636 👁️ | Never ⏰ | []
Java |

1.05 KB

|

None

|

0 👍

/

0 👎

 
  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;
  }

Comments