Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Чтение и запись в файл русских символов, выраженных Unicode префиксом \u




Чтение и запись в файл русских символов, выраженных Unicode префиксом \u

Для чтения данных, записанных как в формате MBCS (используя кодировку UTF-8), так и в формате Unicode, можно использовать класс InputStreamReader из пакета java. io, подставляя в его конструктор различные кодировки. Для записи используется OutputStreamWriter. В описании пакета java. lang написано, что каждая реализация JVM поддерживет следующие кодировки:

Название кодировки Описание
US-ASCII семибитная ASCII, она же ISO646-US, она же основная латинская часть Unicode;
ISO-8859-1 то же самое, что ISO-LATIN-1;
UTF-8 8-битный;
UTF-16BE 16-битный, порядок байт big-endian;
UTF-16LE 16-битный, порядок байт little-endian;
UTF-16 16-битный, порядок байт определяется начальными значениями (допускается любой), на выходе порядок байт big-endian.

Файл WriteDemo. java

import java. io. Writer; import java. io. OutputStreamWriter; import java. io. FileOutputStream; import java. io. IOException; /** * Вывод Unicode строки в файл в заданной кодировке. * @author < a href=" mailto: zagrebin_v@mail. ru" > Victor Zagrebin < /a> */public class WriteDemo{ public static void main(String[] args) throws IOException { String str = " \u043A\u043E" +          " \u0434\u0438\u0440\u043E\u0432" +          " \u043A\u0430"; Writer out1 = new OutputStreamWriter(new FileOutputStream(" out1. txt" ), " Cp1251" ); Writer out2 = new OutputStreamWriter(new FileOutputStream(" out2. txt" ), " Cp866" ); Writer out3 = new OutputStreamWriter(new FileOutputStream(" out3. txt" ), " UTF-8" ); Writer out4 = new OutputStreamWriter(new FileOutputStream(" out4. txt" ), " Unicode" ); out1. write(str); out1. close(); out2. write(str); out2. close(); out3. write(str); out3. close(); out4. write(str); out4. close(); }}

Компиляция:

javac WriteDemo. java

Запуск:

java WriteDemo

В результате выполнения программы должно создаться четыре файла (out1. txt out2. txt out3. txt out4. txt) в каталоге запуска программы, каждый из которых будет содержать слово “кодировка” в разной кодировке, что можно проверить в текстовых редакторах или с помощью просмотра дампа файла.

Следующая программа будет считывать и выводить на экран содержимое каждого из созданных файлов.

Файл ReadDemo. java

 

import java. io. Reader;

import java. io. InputStreamReader;

import java. io. InputStream;

import java. io. FileInputStream;

import java. io. IOException;

 

/**

 * Чтение Unicode символов из файла в заданной кодировке.

 * @author < a href=" mailto: zagrebin_v@mail. ru" > Victor Zagrebin < /a>

 */

public class ReadDemo

{

 public static void main(String[] args) throws IOException

 {

String out_enc = System. getProperty(" console. encoding", " Cp866" );

System. out. write(readStringFromFile(" out1. txt", " Cp1251", out_enc));

System. out. write('\n');

System. out. write(readStringFromFile(" out2. txt", " Cp866", out_enc));

System. out. write('\n');

System. out. write(readStringFromFile(" out3. txt", " UTF-8", out_enc));

System. out. write('\n');

System. out. write(readStringFromFile(" out4. txt", " Unicode", out_enc));

 }

 

 public static byte[] readStringFromFile(String filename,

                                    String file_enc,

                                    String out_enc) throws IOException

 {

int size;

InputStream f = new FileInputStream(filename);

size = f. available();

Reader in = new InputStreamReader(f, file_enc);

char ch[] = new char[size];

in. read(ch, 0, size);

in. close();

return (new String(ch)). getBytes(out_enc);

 }

}

Компиляция:

javac ReadDemo. java

Запуск:

java ReadDemo

Результат вывода программы:

Особо следует отметить использование следующей строки кода в данной программе:

String out_enc = System. getProperty(" console. encoding", " Cp866" );

С помощью метода getProperty осуществляется попытка прочитать значение системного свойства console. encoding, которое задает кодировку, в которой будут выводиться данные на консоль. Если же такое свойство не установлено (зачастую оно не установлено), то переменной out_enc присвоится " Cp866". И далее, переменная out_enc используется там, где необходимо привести считанную из файла строку к кодировке, пригодной для вывода на консоль.

Также возникает закономерный вопрос: “почему используется System. out. write, а не System. out. println”? Как было описано выше, системное свойство file. encoding используется не только для считывания исходного файла, а и для вывода с помощью System. out. println, что в данном случае приведет к некорректному выводу.

Неправильное отображение кодировки в программах, ориентированных на web

Программисту прежде всего следует знать: не имеет смысла иметь строку, не зная, какую кодировку она использует. Не существует такого понятия как " простой" (plain) текст в ASCII. Если у вас есть строка, в памяти, в файле, или в сообщении электронной почты, вы должны знать, в какой она кодировке, иначе вы не сможете ее правильно интерпретировать или показать пользователю.

Почти все традиционные проблемы типа " мой вебсайт похож на тарабарщину" или " мои электронные письма не читаются, если я использую символы с ударениями" лежат на ответственности программиста, который не понимает простого факта, что если вы не знаете в какой кодировке строка UTF-8 или ASCII или ISO 8859-1 (Латинский-1) или Windows 1252 (Западноевропейский), вы просто не сможете вывести ее правильно. Есть более ста кодировок символов выше кодовой точки 127, и нет никакой информации для того, чтобы выяснить, какая кодировка нужна. Как мы сохраняем информацию о том, какую кодировку используют строки? Существуют стандартные способы для указания этой информации. Для сообщений электронной почты вы должны поместить в HTTP заголовок строку

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...