Unicode files encoded in UTF-16 (low or big endian) or UTF-8 files with a Byte Order Marker are correctly discovered. For UTF-8 files with no BOM, if the buffer is wide enough, the charset should also be discovered.
A byte buffer of 4KB is used to be able to guess the encoding.
Usage:
CharsetToolkit toolkit = new CharsetToolkit(file);
// guess the encoding
Charset guessedCharset = toolkit.getCharset();
// create a reader with the correct charset
BufferedReader reader = toolkit.getReader();
// read the file content
String line;
while ((line = br.readLine())!= null)
{
System.out.println(line);
}
| Modifier and Type | Field and Description |
|---|---|
| private final byte[] | |
| private Charset | |
| private Charset | |
| private static final byte[] | |
| private static final Charset[] | |
| private boolean | |
| private final File |
| Access | Constructor and Description |
|---|---|
| public | CharsetToolkit(File
of which we want to know the encoding. file)Constructor of the |
| Modifier and Type | Method and Description |
|---|---|
| public static Charset[] | Returns: an array ofCharsets.Retrieves all the available |
| public Charset | |
| public Charset | |
| public static Charset | |
| public boolean | Returns: a boolean representing the flag of use of US-ASCII.Gets the enforce8Bit flag, in case we do not want to ever get a US-ASCII encoding. |
| public BufferedReader | Returns: aBufferedReaderGets a |
| private Charset | |
| public boolean | Returns: true if the buffer has a BOM for UTF-16 Big Endian.Has a Byte Order Marker for UTF-16 Big Endian (utf-16 and ucs-2). |
| public boolean | Returns: true if the buffer has a BOM for UTF-16 Low Endian.Has a Byte Order Marker for UTF-16 Low Endian (ucs-2le, ucs-4le, and ucs-16le). |
| public boolean | Returns: true if the buffer has a BOM for UTF8.Has a Byte Order Marker for UTF-8 (Used by Microsoft's Notepad and other editors). |
| private static boolean | Returns: true if it's a continuation char.a byte. b)If the byte has the form 10xxxxx, then it's a continuation byte of a multiple byte character; |
| private static boolean | Returns: true if it's the first byte of a five-bytes sequence.a byte. b)If the byte has the form 11110xx, then it's the first byte of a five-bytes sequence character. |
| private static boolean | Returns: true if it's the first byte of a four-bytes sequence.a byte. b)If the byte has the form 11110xx, then it's the first byte of a four-bytes sequence character. |
| private static boolean | Returns: true if it's the first byte of a six-bytes sequence.a byte. b)If the byte has the form 1110xxx, then it's the first byte of a six-bytes sequence character. |
| private static boolean | Returns: true if it's the first byte of a three-bytes sequence.a byte. b)If the byte has the form 1110xxx, then it's the first byte of a three-bytes sequence character. |
| private static boolean | Returns: true if it's the first byte of a two-bytes sequence.a byte. b)If the byte has the form 110xxxx, then it's the first byte of a two-bytes sequence character. |
| public void | setDefaultCharset(Charset
the default defaultCharset)Charset to be returned
if an 8-bit Charset is encountered.Defines the default |
| public void | setEnforce8Bit(boolean
a boolean specifying the use or not of US-ASCII. enforce)If US-ASCII is recognized, enforce to return the default encoding, rather than US-ASCII. |
| buffer | back to summary |
|---|---|
| private final byte[] buffer | |
| charset | back to summary |
|---|---|
| private Charset charset | |
| defaultCharset | back to summary |
|---|---|
| private Charset defaultCharset | |
| EMPTY_BYTE_ARRAY | back to summary |
|---|---|
| private static final byte[] EMPTY_BYTE_ARRAY | |
| EMPTY_CHARSET_ARRAY | back to summary |
|---|---|
| private static final Charset[] EMPTY_CHARSET_ARRAY | |
| enforce8Bit | back to summary |
|---|---|
| private boolean enforce8Bit | |
| file | back to summary |
|---|---|
| private final File file | |
| CharsetToolkit | back to summary |
|---|---|
| public CharsetToolkit(File file) throws IOException Constructor of the
| |
| getAvailableCharsets | back to summary |
|---|---|
| public static Charset[] getAvailableCharsets() Retrieves all the available
| |
| getCharset | back to summary |
|---|---|
| public Charset getCharset() | |
| getDefaultCharset | back to summary |
|---|---|
| public Charset getDefaultCharset() Retrieves the default Charset | |
| getDefaultSystemCharset | back to summary |
|---|---|
| public static Charset getDefaultSystemCharset() Retrieve the default charset of the system.
| |
| getEnforce8Bit | back to summary |
|---|---|
| public boolean getEnforce8Bit() Gets the enforce8Bit flag, in case we do not want to ever get a US-ASCII encoding.
| |
| getReader | back to summary |
|---|---|
| public BufferedReader getReader() throws FileNotFoundException Gets a
| |
| guessEncoding | back to summary |
|---|---|
| private Charset guessEncoding() Guess the encoding of the provided buffer. If Byte Order Markers are encountered at the beginning of the buffer, we immediately return the charset implied by this BOM. Otherwise, the file would not be a human readable text file. If there is no BOM, this method tries to discern whether the file is UTF-8 or not. If it is not UTF-8, we assume the encoding is the default system encoding (of course, it might be any 8-bit charset, but usually, an 8-bit charset is the default one). It is possible to discern UTF-8 thanks to the pattern of characters with a multi-byte sequence. UCS-4 range (hex.) UTF-8 octet sequence (binary) 0000 0000-0000 007F 0xxxxxxx 0000 0080-0000 07FF 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0400 0000-7FFF FFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxWith UTF-8, 0xFE and 0xFF never appear.
| |
| hasUTF16BEBom | back to summary |
|---|---|
| public boolean hasUTF16BEBom() Has a Byte Order Marker for UTF-16 Big Endian (utf-16 and ucs-2).
| |
| hasUTF16LEBom | back to summary |
|---|---|
| public boolean hasUTF16LEBom() Has a Byte Order Marker for UTF-16 Low Endian (ucs-2le, ucs-4le, and ucs-16le).
| |
| hasUTF8Bom | back to summary |
|---|---|
| public boolean hasUTF8Bom() Has a Byte Order Marker for UTF-8 (Used by Microsoft's Notepad and other editors).
| |
| isContinuationChar | back to summary |
|---|---|
| private static boolean isContinuationChar(byte b) If the byte has the form 10xxxxx, then it's a continuation byte of a multiple byte character;
| |
| isFiveBytesSequence | back to summary |
|---|---|
| private static boolean isFiveBytesSequence(byte b) If the byte has the form 11110xx, then it's the first byte of a five-bytes sequence character.
| |
| isFourBytesSequence | back to summary |
|---|---|
| private static boolean isFourBytesSequence(byte b) If the byte has the form 11110xx, then it's the first byte of a four-bytes sequence character.
| |
| isSixBytesSequence | back to summary |
|---|---|
| private static boolean isSixBytesSequence(byte b) If the byte has the form 1110xxx, then it's the first byte of a six-bytes sequence character.
| |
| isThreeBytesSequence | back to summary |
|---|---|
| private static boolean isThreeBytesSequence(byte b) If the byte has the form 1110xxx, then it's the first byte of a three-bytes sequence character.
| |
| isTwoBytesSequence | back to summary |
|---|---|
| private static boolean isTwoBytesSequence(byte b) If the byte has the form 110xxxx, then it's the first byte of a two-bytes sequence character.
| |
| setDefaultCharset | back to summary |
|---|---|
| public void setDefaultCharset(Charset defaultCharset) Defines the default
| |
| setEnforce8Bit | back to summary |
|---|---|
| public void setEnforce8Bit(boolean enforce) If US-ASCII is recognized, enforce to return the default encoding, rather than US-ASCII.
It might be a file without any special character in the range 128-255, but that may be or become
a file encoded with the default
| |