Чтение и запись в файл русских символов, выраженных Unicode префиксом \u
Чтение и запись в файл русских символов, выраженных Unicode префиксом \u Для чтения данных, записанных как в формате MBCS (используя кодировку UTF-8), так и в формате Unicode, можно использовать класс InputStreamReader из пакета java. io, подставляя в его конструктор различные кодировки. Для записи используется OutputStreamWriter. В описании пакета java. lang написано, что каждая реализация JVM поддерживет следующие кодировки:
Файл 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|