blob: 8013d5d23c326e338e8613adbcfc0c0052867fd6 [file] [log] [blame]
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.axis.components.encoding;
import org.apache.axis.i18n.Messages;
import java.io.IOException;
import java.io.Writer;
/**
* UTF-16 Encoder.
*
* @author <a href="mailto:jens@void.fm">Jens Schumann</a>
* @see <a href="http://encoding.org">encoding.org</a>
* @see <a href="http://czyborra.com/utf/#UTF-16">UTF 16 explained</a>
*/
class UTF16Encoder extends AbstractXMLEncoder {
/**
* gets the encoding supported by this encoder
* @return string
*/
public String getEncoding() {
return XMLEncoderFactory.ENCODING_UTF_16;
}
/**
* write the encoded version of a given string
*
* @param writer writer to write this string to
* @param xmlString string to be encoded
*/
public void writeEncoded(Writer writer, String xmlString)
throws IOException {
if (xmlString == null) {
return;
}
int length = xmlString.length();
char character;
for (int i = 0; i < length; i++) {
character = xmlString.charAt( i );
switch (character) {
// we don't care about single quotes since axis will
// use double quotes anyway
case '&':
writer.write(AMP);
break;
case '"':
writer.write(QUOTE);
break;
case '<':
writer.write(LESS);
break;
case '>':
writer.write(GREATER);
break;
case '\n':
writer.write(LF);
break;
case '\r':
writer.write(CR);
break;
case '\t':
writer.write(TAB);
break;
default:
if (character < 0x20) {
throw new IllegalArgumentException(Messages.getMessage(
"invalidXmlCharacter00",
Integer.toHexString(character),
xmlString.substring(0, i)));
} else if (character > 0xFFFF) {
writer.write((0xD7C0 + (character >> 10)));
writer.write((0xDC00 | character & 0x3FF));
} else {
writer.write(character);
}
break;
}
}
}
}