Ho avuto lo stesso problema come Edward. Sono d'accordo con Dustin, in genere non si useranno caratteri null nei file di testo.
Tuttavia, ho creato un file che contiene tutti i caratteri Unicode. Ho usato per la prima volta la codifica utf-32le, poi una codifica utf-32be, una codifica utf-16le e utf-16be oltre a una codifica utf-8.
Durante il tentativo di ricodificare i file in utf-8, volevo confrontare il risultato con il file utf-8 già esistente. Poiché il primo carattere nei miei file dopo il BOM è il carattere null, non sono riuscito a rilevare il file con BOM utf-16le, si è mostrato come BOM utf-32le, poiché i byte sono apparsi esattamente come descritto da Edward. Il primo carattere dopo il BOM FFFE è 0000, ma il rilevamento BOM ha trovato un BOM FFFE0000 e così, ha rilevato utf-32le invece di utf-16le per cui il mio primo 0000-personaggio è stato rubato e preso come parte del BOM.
Quindi non si dovrebbe mai usare un carattere null come primo carattere di un file codificato con utf-16 little endian, perché renderà ambigue le utf-16le e utf-32le BOM.
Per risolvere il mio problema, scambierò il primo e il secondo carattere. :-)
Il carattere null può essere parte di un protocollo di ordine superiore codificato nel testo. Unicode non si preoccupa realmente di quali punti di codice vengono usati nel testo e U + 0000 è valido come U + 0041. – Joey
Leggendo un protocollo di ordine superiore, questa teoria è in conflitto con l'impostazione della domanda in cui la codifica deve essere indovinata. Se stai leggendo un protocollo, non indovinerai la codifica. – u0b34a0f6ae
Per dirla in un altro modo, non è * impossibile * avere un U + 0000 all'inizio di un file, ma è * estremamente raro *. Se questa è una possibilità per i dati che stai leggendo, non dovresti fare affidamento su una distinta base per il rilevamento del formato. –