/* * @(#)UnicodeWriter.java * * Copyright (c) 2005-2008 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, * as a non-commercial test project. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package net.sourceforge.dvb.projectx.subtitle; import java.io.DataOutputStream; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import java.io.IOException; /** * */ public class UnicodeWriter extends Object { private DataOutputStream out1; private PrintWriter out2; private boolean useUnicode = false; private boolean useUTF8 = false; private short mask_1 = ~0x7F; private short mask_2 = ~0x7FF; /** * */ private UnicodeWriter() {} /** * */ public UnicodeWriter(ByteArrayOutputStream _out, boolean _useUTF16, boolean _useUTF8) { useUnicode = (_useUTF16 || _useUTF8); //UTF16 standard useUTF8 = _useUTF8; if (useUnicode) out1 = new DataOutputStream(_out); else out2 = new PrintWriter(_out, true); } /** * */ public void flush() throws IOException { if (useUnicode) out1.flush(); else out2.flush(); } /** * */ public void close() throws IOException { if (useUnicode) out1.close(); else out2.close(); } /** * */ public void print(String str) throws IOException { if (!useUnicode) { out2.print(str); return; } // UTF8 if (useUTF8) { // mark file as UTF-8, from akin if (out1.size() == 0) out1.write( new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF}, 0, 3); char[] chars = str.toCharArray(); for (int i = 0, j = chars.length; i < j; i++) { if ((mask_1 & chars[i]) == 0) //0xxxxxxx - 0000-007F out1.writeByte(chars[i]); else if ((mask_2 & chars[i]) == 0) //110xxxxx 10xxxxxx - 0080-07FF out1.writeShort(0xC080 | (0x1F00 & chars[i]<<2) | (0x3F & chars[i])); else //1110xxxx 10xxxxxx 10xxxxxx - 0800-FFFF { out1.writeByte(0xE0 | (0xF0000 & chars[i]<<4)); out1.writeShort(0x8080 | (0x3F00 & chars[i]<<2) | (0x3F & chars[i])); } } return; } // UTF16 /** * mark file as big endian unicode */ if (out1.size() == 0) out1.writeChar(0xFEFF); out1.writeChars(str); } /** * */ public void println(String str) throws IOException { if (useUnicode) { print(str); print(System.getProperty("line.separator")); } else out2.println(str); } /** * */ public void println() throws IOException { if (useUnicode) print(System.getProperty("line.separator")); else out2.println(); } }