Java does not recognize initial BOM
Non lo sapevo ma quando l’ho saputo.. ci sono rimasto male..
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
Incollo qui un piccolo metodino che riconosce il Byte Order Mark..
/**
* Metodo che esegue l'eventuale eliminazione del BOM(Byte Order Mark)
* @param bytes
* @return byte[]
*/
private byte[] deleteBOM(byte[] bytes) {
byte[] bytesNoBOM = null;
try {
// La codifica UTF-8 può presentare il BOM che deve essere eliminato
// per eseguire la validazione
if ((bytes[0] == (byte) 0x00) && (bytes[1] == (byte) 0x00) &&
(bytes[2] == (byte) 0xFE) && (bytes[3] == (byte) 0xFF)) {
System.out.println("Trovato BOM UTF-32BE");
bytesNoBOM = new byte[bytes.length - 4];
for (int i = 0; i < bytesNoBOM.length; i++) {
bytesNoBOM[i] = bytes[i + 4];
}
} else if ((bytes[0] == (byte) 0xFF) && (bytes[1] == (byte) 0xFE) &&
(bytes[2] == (byte) 0x00) && (bytes[3] == (byte) 0x00)) {
System.out.println("Trovato BOM UTF-32LE");
bytesNoBOM = new byte[bytes.length - 4];
for (int i = 0; i < bytesNoBOM.length; i++) {
bytesNoBOM[i] = bytes[i + 4];
}
} else if ((bytes[0] == (byte) 0xEF) && (bytes[1] == (byte) 0xBB) &&
(bytes[2] == (byte) 0xBF)) {
System.out.println("Trovato BOM UTF-8");
bytesNoBOM = new byte[bytes.length - 3];
for (int i = 0; i < bytesNoBOM.length; i++) {
bytesNoBOM[i] = bytes[i + 3];
}
} else if ((bytes[0] == (byte) 0xFE) && (bytes[1] == (byte) 0xFF)) {
System.out.println("Trovato BOM UTF-16BE");
bytesNoBOM = new byte[bytes.length - 2];
for (int i = 0; i < bytesNoBOM.length; i++) {
bytesNoBOM[i] = bytes[i + 2];
}
} else if ((bytes[0] == (byte) 0xFF) && (bytes[1] == (byte) 0xFE)) {
System.out.println("Trovato BOM UTF-16LE");
bytesNoBOM = new byte[bytes.length - 2];
for (int i = 0; i < bytesNoBOM.length; i++) {
bytesNoBOM[i] = bytes[i + 2];
}
} else {
System.out.println("No BOM founded");
bytesNoBOM = bytes;
}
} catch (Exception e) {
e.printStackTrace();
}
return bytesNoBOM;
}