Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Кодировка (encoding) – это способ описания (кодирования) всех возможных символов цепочками битов. «Ранние» кодировки, разработанные еще до появления Unicode, были рассчитаны на 8- или даже 7-битовое представление символа: с их помощью можно записать текст, содержащий максимум 256 (или соответственно 128) различных символов алфавита. Современные кодировки, такие как UTF-8 или UTF-16, резервируют более 8 бит на 1 символ и позволяют представить текст, содержащий любые из 65536 стандартных символов Unicode, в том числе иероглифы и всевозможные специальные знаки.
Каждая кодировка в Java идентифицируется своим именем. Стандартные библиотеки Java гарантированно «понимают» кодировки со следующими именами:
n «ASCII» – 7-битовая кодировка ASCII для англоязычных текстов;
n «Cp1252», «ISO8859_1» – 8-битовые расширения ASCII для западноевропейских языков;
n «UnicodeBig», «UnicodeBigUnmarked», «UnicodeLittle», «UnicodeLittleUnmarked», «UTF-16» – основные варианты 16-битовой кодировки Unicude;
n «UTF-8» – псевдо-8-битовая кодировка Unicode (в действительности на разные символы отводится разное число бит).
7- и 8-битовые кодировки предполагают, что каждый символ текста хранится в отдельном байте файла. В случае 7-битовой кодировки старший бит каждого байта попросту не используется (предполагается равным 0).
16-битовые кодировки Unicode отводят на каждый символ 16-битовое («короткое») слово файла. Друг от друга они отличаются наличием или отсутствием в файле специального 16-битового префикса, идентифицирующего формат Unicode, и порядком байт в 16-битовом слове.
Кодировки «UnicodeBig», «UnicodeLittle» и «UTF-16» предполагают, что первые 16 бит файла содержат префикс 0xFEFF, указывающий, что файл записан в формате Unicode. Кодировки «UnicodeBigUnmarked» и «UnicodeLittleUnmarked» интерпретируют первые 16 бит файла как первый символ текста. Кодировки «UnicodeBig» и «UnicodeBigUnmarked» предполагают порядок байт big-endian: старший байт каждого слова следует в файле перед младшим. Кодировки «UnicodeLittle» и «UnicodeLittleUnmarked» предполагают порядок little-endian, более привычный пользователям Intel-процессоров: младший байт каждого слова имеет в файле меньшее смещение от начала файла. При наличии префикса 0xFEFF порядок байт касается и способа записи этого префикса: в случае big-endian первым байтом файла будет 0xFE, в случае little-endian – 0xFF. Кодировка «UTF-16» не уточняет, какой именно будет порядок байт, но в этом случае префикс 0xFEFF является обязательным. Исходя из способа записи этого префикса, в готовом файле можно будет определить порядок байт в слове. Кодировка «UTF-8», строго говоря, не является 8-битовой, хотя и ориентирована на побайтовое хранение данных. В этой кодировке стандартные символы ASCII, имеющие в терминах Unicode коды 0..127, кодируются с помощью только одного байта, а все прочие символы «расходуют» 2 или более байт. Эта кодировка – наиболее универсальная и удобная в большинстве случаев. Для текстов, не содержащих национальных и специальных символов, кодировка «UTF-8» столь же компактна, как и традиционная ASCII, но при этом сохраняется принципиальная возможность записывать любые символы Unicode.
Чтение и запись текстового файла: алгоритмика
Прочитать целиком текстовый файл несколько сложнее, чем бинарный. В случае бинарного файла мы заранее знали размер требуемого буфера – он был равен длине файла. Число символов, содержащихся в текстовом файле, в общем случае невозможно определить, не прочитав файл, за исключением некоторых простых кодировок.
Наиболее естественно использовать для чтения текстового файла постепенно увеличивающийся буфер StringBuffer. Вот вариант готового решения:
public static String loadFileAsString(
File file, String encoding)