blob: eb6d00fb131b800432ea9dccced9ca54234dfb9b [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xalan" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
// Class header file.
#include "FormatterToXML.hpp"
#include <sax/AttributeList.hpp>
#include <sax/SAXException.hpp>
#include <PlatformSupport/DOMStringHelper.hpp>
#include <PlatformSupport/Writer.hpp>
#include <string>
static const char* const theDefaultAttrSpecialChars = "<>&\"\'\r\n";
const DOMString FormatterToXML::DEFAULT_MIME_ENCODING = XALAN_STATIC_UCODE_STRING("UTF-8");
XMLCh FormatterToXML::m_charBuf[MAXCHARBUF];
// This should be OK on all platforms ??
XMLCh FormatterToXML::m_lineSep = '\n';
bool FormatterToXML::m_javaEncodingIsISO = false;
FormatterToXML::FormatterToXML(
Writer& writer,
const DOMString& /* version */,
bool doIndent,
int indent,
const DOMString& encoding,
const DOMString& /*mediaType */,
const DOMString& doctypeSystem,
const DOMString& doctypePublic,
bool xmlDecl,
const DOMString& /* standalone */,
const QNameVectorType* const /* cdataSectionElems */) :
FormatterListener(),
m_attrSpecialChars(theDefaultAttrSpecialChars),
m_currentIndent(0),
m_doctypePublic(doctypePublic),
m_doctypeSystem(doctypeSystem),
m_doIndent(doIndent),
m_elemStack(),
m_encoding(encoding),
m_escapeCData(false),
m_indent(indent),
m_ispreserve(false),
m_isprevtext(false),
m_level(0),
m_maxCharacter(0x007F),
m_needToOutputDocTypeDecl(true),
m_nextIsRaw(false),
m_preserves(),
m_shouldWriteXMLHeader(xmlDecl),
m_spaceBeforeClose(false),
m_startNewLine(true),
m_stripCData(false),
m_version(""),
m_writer(writer)
{
if(! isEmpty(m_doctypePublic))
{
if(startsWith(m_doctypePublic, "-//W3C//DTD XHTML"))
m_spaceBeforeClose = true;
}
// Determine the last printable character based on the output format
// @@ JMD: We don't have no OutputFormat class yet ...
// java: m_maxCharacter = format.getLastPrintable();
m_isUTF8 = equals(m_encoding, "UTF-8") || isEmpty(m_encoding);
if(isEmpty(m_encoding))
{
/*
@@ JMD: Not supported yet:
java:
encoding = System.getProperty("file.encoding");
encoding = (null != encoding) ?
FormatterToXML.convertJava2MimeEncoding(encoding ) : DEFAULT_MIME_ENCODING;
*/
m_encoding = DEFAULT_MIME_ENCODING;
}
DOMString2IntMapType::const_iterator it =
s_revsize.find(toUpperCase(m_encoding));
if (it != s_revsize.end())
m_maxCharacter = (*it).second;
m_isUTF8 = equals(m_encoding, "UTF-8");
it = s_revsize.find(toUpperCase(m_encoding));
if (it != s_revsize.end())
{
m_maxCharacter = (*it).second;
}
}
FormatterToXML::~FormatterToXML()
{
}
void
FormatterToXML::setDocumentLocator(Locator* const /* locator */)
{
// I don't do anything with this yet.
}
void
FormatterToXML::startDocument()
{
try
{
m_needToOutputDocTypeDecl = true;
m_startNewLine = false;
if(m_shouldWriteXMLHeader)
{
DOMString encoding = m_encoding;
if(isEmpty(encoding))
{
/*
java:
try
{
encoding = System.getProperty("file.encoding");
encoding = FormatterToXML.convertJava2MimeEncoding( encoding );
}
catch(SecurityException se)
{
encoding = "ISO-8859-1";
}
*/
encoding = "ISO-8859-1";
}
DOMString version = (isEmpty(m_version)) ? "1.0" : m_version;
m_writer.write("<?xml version=\""+version+"\" encoding=\""+
encoding + "\"?>");
m_writer.write(m_lineSep);
}
}
// java: catch(IOException ioe)
catch(...)
{
throw SAXException("IO error");
}
}
void
FormatterToXML::endDocument()
{
try
{
m_writer.flush();
}
catch(...)
{
throw SAXException();
}
}
void
FormatterToXML::startElement(
const XMLCh* const name,
AttributeList& attrs)
{
try
{
if((true == m_needToOutputDocTypeDecl) && (! isEmpty(m_doctypeSystem)))
{
m_writer.write("<!DOCTYPE ");
m_writer.write(name);
if(! isEmpty(m_doctypePublic))
{
m_writer.write(" PUBLIC \"");
m_writer.write(m_doctypePublic);
m_writer.write("\"");
}
if(isEmpty(m_doctypePublic))
m_writer.write(" SYSTEM \"");
else
m_writer.write(" \"");
m_writer.write(m_doctypeSystem);
m_writer.write("\">");
m_writer.write(m_lineSep);
}
m_needToOutputDocTypeDecl = false;
writeParentTagEnd();
m_ispreserve = false;
if (shouldIndent() && !m_elemStack.empty())
{
m_startNewLine = true;
indent(m_writer, m_currentIndent);
}
m_writer.write('<');
m_writer.write(name);
int nAttrs = attrs.getLength();
for (int i = 0; i < nAttrs ; i++)
{
processAttribute(attrs.getName(i), attrs.getValue(i));
}
// Flag the current element as not yet having any children.
openElementForChildren();
m_currentIndent += m_indent;
m_isprevtext = false;
}
// java: catch(IOException ioe)
catch(...)
{
throw SAXException("IO error");
}
}
void
FormatterToXML::endElement(const XMLCh* const name)
{
try
{
m_currentIndent -= m_indent;
const bool hasChildNodes = childNodesWereAdded();
if (hasChildNodes == true)
{
if (shouldIndent() == true)
indent(m_writer, m_currentIndent);
m_writer.write(DOMString("</") + name + DOMString(">"));
}
else
{
if(m_spaceBeforeClose)
m_writer.write(" />");
else
m_writer.write("/>");
}
if (hasChildNodes == true)
{
if (m_preserves.size() == 0)
{
m_ispreserve = false;
}
else
{
m_ispreserve = m_preserves.top();
m_preserves.pop();
}
}
m_isprevtext = false;
}
catch(...)
{
throw SAXException();
}
}
void
FormatterToXML::characters(
const XMLCh* const chars,
const unsigned int length)
{
if(0 == length)
return;
if(m_nextIsRaw)
{
m_nextIsRaw = false;
charactersRaw (chars, length);
return;
}
try
{
writeParentTagEnd();
m_ispreserve = true;
int pos = 0;
int end = length;
for (int i = 0; i < end; i ++)
{
const XMLCh ch = chars[i];
const int chNum = ch;
if ('\n' == ch)
{
/*
java:
for(int k = 0; k < m_lineSepLen; k++)
{
m_charBuf[pos++] = m_lineSep.charAt(k);
}
*/
m_charBuf[pos++] = m_lineSep;
}
else if ('<' == ch)
{
pos = copyEntityIntoBuf("lt", pos);
}
else if ('>' == ch)
{
pos = copyEntityIntoBuf("gt", pos);
}
else if ('&' == ch)
{
pos = copyEntityIntoBuf("amp", pos);
}
// Regular old ASCII character
else if((((chNum >= 20) && (chNum <= 126))
|| (chNum == 10)
|| (chNum == 13)
|| (chNum == 9)))
{
// System.out.println("ch: "+ch);
m_charBuf[pos++] = ch;
}
else if((chNum >= 20) && (ch <= m_maxCharacter))
{
// System.out.println("ch(2): "+ch);
// Hope this is right...
m_charBuf[pos++] = ch;
}
else
{
copyBigCharIntoBuf(chars, i, pos, length);
}
// Use 80 as a best guess safe buffer
if(pos > MAXSAFECHARBUF)
{
m_writer.write(m_charBuf, 0, pos);
pos = 0;
}
}
// System.out.println(new String(m_charBuf, 0, pos));
m_writer.write(m_charBuf, 0, pos);
m_isprevtext = true;
}
// java: catch(IOException ioe)
catch(...)
{
throw SAXException("IO error");
}
}
void
FormatterToXML::charactersRaw(
const XMLCh* const chars,
const unsigned int length)
{
try
{
writeParentTagEnd();
m_ispreserve = true;
m_writer.write(chars, 0, length);
m_writer.flush();
}
// java: catch(IOException ioe)
catch(...)
{
throw SAXException();
}
}
void FormatterToXML::copyBigCharIntoBuf(
const XMLCh* const chars, // Character string to process
int& i, // Index into 'chars'
int& pos, // Index in m_charBuf
int length, // Length of 'chars' string
XMLCh* theBuffer /* m_charBuf */ // Buffer to write to
)
/*
* Processes a non-ASCII character either in hexadecimal format (&#Xnnn;) if
* the character is in the range 0xd800 to 0xdc00 or decimal format (&#nnn;),
* and places the result in member 'm_charBuf.' Side effect, indices 'i' and
* 'pos' are incremented. On exit, 'theBuffer' will contain a null terminated
* Unicode string.
*/
{
DOMString msg("Invalid UTF-16 surrogate detected: ");
DOMString ds;
int c = chars[i];
if (0xd800 <= c && c < 0xdc00)
{
// UTF-16 surrogate
int next;
if (i+1 >= length)
{
msg = append(msg, LongToHexDOMString(c));
msg = append(msg, " ?");
throw SAXException(c_wstr(msg));
}
else
{
next = chars[++i];
if (!(0xdc00 <= next && next < 0xe000))
{
msg = append(msg, LongToHexDOMString(c));
msg = append(msg, " ");
msg = append(msg, LongToHexDOMString(next));
throw SAXException(c_wstr(msg));
}
next = ((c-0xd800)<<10)+next-0xdc00+0x00010000;
}
theBuffer[pos++] = '&';
theBuffer[pos++] = '#';
theBuffer[pos++] = 'x';
ds = LongToHexDOMString(next);
const XMLCh* pb = c_wstr(ds);
int nIntStr = ds.length();
for(int k = 0; k < nIntStr; k++)
{
theBuffer[pos++] = *(pb+k);
}
theBuffer[pos++] = ';';
}
else
{
theBuffer[pos++] = '&';
theBuffer[pos++] = '#';
ds = LongToDOMString(c);
const XMLCh* pb = c_wstr(ds);
int nIntStr = ds.length();
for(int k = 0; k < nIntStr; k++)
{
theBuffer[pos++] = *(pb+k);
}
theBuffer[pos++] = ';';
}
theBuffer[pos] = 0; // null terminate
}
void FormatterToXML::writeBigChar(const XMLCh* const ch, int& i, int end)
/*
* Writes a non-ASCII character either in hexadecimal format (&#Xnnn;) if the
* character is in the range 0xd800 to 0xdc00 or decimal format (&#nnn;); as a
* side effect the current character index (i) is incremented
*/
{
XMLCh buffer[32]; // Should be big enough
int pos = 0;
copyBigCharIntoBuf(ch, i, pos, end, buffer);
m_writer.write(buffer);
}
void FormatterToXML::writeNormalizedChars(
const XMLCh* const ch,
int start, int length,
bool isCData)
{
int end = start+length;
for(int i = start; i < end; i++)
{
XMLCh c = ch[i];
if('\n' == c)
{
m_writer.write(m_lineSep);
}
else if(isCData && (c > m_maxCharacter))
{
if(i != 0)
m_writer.write("]]>");
writeBigChar(ch, i, end);
// @@ JMD: this differs from java
// java: if((i != 0) && (i < (end-1)))
if( (i < (end-1)))
m_writer.write("<![CDATA[");
}
else if(isCData && ((i < (end-2)) && (']' == c) &&
(']' == ch[i+1]) && ('>' == ch[i+2])))
{
m_writer.write("]]]]><![CDATA[>");
i+=2;
}
else
{
if(c <= m_maxCharacter)
{
m_writer.write(c);
}
else
writeBigChar(ch, i, end);
}
}
}
void
FormatterToXML::entityReference(const XMLCh* const name)
{
try
{
writeParentTagEnd();
if (shouldIndent() == true)
{
indent(m_writer, m_currentIndent);
}
m_writer.write("&");
m_writer.write(name);
m_writer.write(";");
}
catch(...)
{
throw SAXException();
}
}
void
FormatterToXML::ignorableWhitespace(
const XMLCh* const chars,
const unsigned int length)
{
characters(chars, length);
}
void
FormatterToXML::processingInstruction(
const XMLCh* const target,
const XMLCh* const data)
{
try
{
writeParentTagEnd();
if (shouldIndent() == true)
{
indent(m_writer, m_currentIndent);
}
m_writer.write("<?");
m_writer.write(target);
if (length(data) > 0 && !isSpace(data[0]))
{
m_writer.write(" ");
}
m_writer.write(data);
m_writer.write("?>");
m_startNewLine = true;
}
catch(...)
{
throw SAXException();
}
}
void
FormatterToXML::resetDocument()
{
// I don't do anything with this yet.
}
void
FormatterToXML::comment(const XMLCh* const data)
{
try
{
writeParentTagEnd();
if (shouldIndent() == true)
{
indent(m_writer, m_currentIndent);
}
m_writer.write("<!--");
m_writer.write(data);
m_writer.write("-->");
m_startNewLine = true;
}
catch(...)
{
throw SAXException();
}
}
void
FormatterToXML::cdata(
const XMLCh* const ch,
const unsigned int length)
{
try
{
if(m_nextIsRaw)
{
m_nextIsRaw = false;
charactersRaw (ch, length);
return;
}
if(m_escapeCData) // Should normally always be false.
{
characters(ch, length);
}
else
{
writeParentTagEnd();
m_ispreserve = true;
if (shouldIndent())
indent(m_writer, m_currentIndent);
if(!m_stripCData)
{
if(((length >= 1) && (ch[0] <= m_maxCharacter)))
{
m_writer.write("<![CDATA[");
}
}
// m_writer.write(ch, 0, length);
writeNormalizedChars(ch, 0, length, !m_stripCData);
if(!m_stripCData)
{
if(((length >= 1) && (ch[(length)-1] <= m_maxCharacter)))
{
m_writer.write("]]>");
}
}
}
}
// java: catch(IOException ioe)
catch(...)
{
throw SAXException("IO error");
}
}
void
FormatterToXML::writeParentTagEnd()
{
try
{
if(!m_elemStack.empty())
{
// See if the parent element has already been flagged as having children.
if(false == m_elemStack.top())
{
m_writer.write(">");
m_elemStack.pop();
m_elemStack.push(true);
m_preserves.push(m_ispreserve);
}
}
}
catch(...)
{
throw SAXException();
}
}
void
FormatterToXML::openElementForChildren()
{
m_elemStack.push(false);
}
bool
FormatterToXML::childNodesWereAdded()
{
bool fResult = false;
if (m_elemStack.size() > 0)
{
fResult = m_elemStack.top();
m_elemStack.pop();
}
return fResult;
}
void
FormatterToXML::processAttribute(
const DOMString& name,
const DOMString& value)
{
try
{
m_writer.write(" ");
m_writer.write(name);
m_writer.write("=\"");
m_writer.write(prepAttrString(value, m_attrSpecialChars, m_encoding));
m_writer.write("\"");
}
catch(...)
{
throw SAXException();
}
}
DOMString
FormatterToXML::prepAttrString(
const DOMString& string,
const DOMString& specials,
const DOMString& /* encoding */)
{
const unsigned int theLength = string.length();
// we'll do the work into a buffer pre-allocated to
// twice the size of the original string, giving some
// room to grow without reallocating.
//
// Whem DOMString has gets a better += operator
// for XMLCh and XMLCh*, a more straightforward
// solution will give good performance
std::vector<XMLCh> vec;
vec.reserve(theLength*2);
for (unsigned int i = 0; i < theLength; i ++)
{
const XMLCh ch = charAt(string, i);
const int chNum = static_cast<int>(ch);
const int index = indexOf(specials, ch);
if (index >= 0)
{
vec.push_back('&');
vec.push_back('#');
vec.push_back(ch);
vec.push_back(';');
}
else if (0xd800 <= chNum && chNum < 0xdc00)
{
// UTF-16 surrogate
int next = 0;
if (i + 1 >= theLength)
{
throw SAXException();
// $$$ ToDo: Fix this!!!
// throw new SAXException("Invalid UTF-16 surrogate detected: "
// +Integer.toHexString(ch)+ " ?");
}
else
{
next = charAt(string, ++i);
if (!(0xdc00 <= next && next < 0xe000))
{
throw SAXException();
// $$$ ToDo: Fix this!!!
// throw new SAXException("Invalid UTF-16 surrogate detected: "
// +Integer.toHexString(ch)+" "+Integer.toHexString(next));
}
next = ((ch-0xd800)<<10) + next - 0xdc00 + 0x00010000;
}
vec.push_back('&');
vec.push_back('#');
vec.push_back('x');
const DOMString num = LongToHexDOMString(next);
for (unsigned int k=0; k < length(num); k++)
vec.push_back(charAt(num, k));
vec.push_back(';');
}
/*
else if (null != ctbc && !ctbc.canConvert(ch))
{
sb.append("&#x");
sb.append(Integer.toString((int)ch, 16));
sb.append(";");
}
*/
else
{
vec.push_back(ch);
}
}
vec.push_back('\0');
return DOMString(vec.begin());
}
bool
FormatterToXML::shouldIndent() const
{
return m_doIndent && (!m_ispreserve && !m_isprevtext);
}
void
FormatterToXML::printSpace(
Writer& pw,
int n)
{
try
{
for (int i = 0; i < n; i++)
{
pw.write(' ');
}
}
catch(...)
{
throw SAXException();
}
}
void
FormatterToXML::indent(
Writer& pw,
int n)
{
try
{
if(m_startNewLine == true)
{
pw.write('\n');
}
if(m_doIndent == true)
{
printSpace(pw, n);
}
}
catch(...)
{
throw SAXException();
}
}
int FormatterToXML::copyEntityIntoBuf(
const DOMString& s,
int pos)
{
const int l = length(s);
m_charBuf[pos++] = '&';
for(int i = 0; i < l; i++)
{
m_charBuf[pos++] = charAt(s, i);
}
m_charBuf[pos++] = ';';
return pos;
}
int FormatterToXML::copyUTF16IntoBuf(
const XMLCh* const chars, // Character string to process
int& i, // Index into 'chars'
int& pos, // Index in m_charBuf
int length // Length of 'chars' string
)
/*
* Processes a UTF-16 surrogate character sequence, and places the result in
* member 'm_charBuf.' Side effect, indices 'i' and 'pos' are incremented.
* Method consumes two characters from the input buffer
*/
{
DOMString msg("Invalid UTF-16 surrogate detected: ");
// UTF-16 surrogate
int next;
int ch = chars[i];
if (i+1 >= length)
{
msg = append(msg, LongToHexDOMString(ch));
throw SAXException(c_wstr(msg));
}
else
{
next = chars[++i];
if (!(0xdc00 <= next && next < 0xe000))
{
msg = append(msg, LongToHexDOMString(ch));
msg = append(msg, " ");
msg = append(msg, LongToHexDOMString(next));
throw SAXException(c_wstr(msg));
}
next = ((ch-0xd800)<<10)+next-0xdc00+0x00010000;
}
m_charBuf[pos++] = '&';
m_charBuf[pos++] = '#';
DOMString ds;
ds = LongToDOMString(ch);
const XMLCh* pb = c_wstr(ds);
int nIntStr = ds.length();
for(int k = 0; k < nIntStr; k++)
{
m_charBuf[pos++] = pb[k];
}
m_charBuf[pos++] = ';';
return pos;
}
FormatterToXML::DOMStringMapType FormatterToXML::s_enchash;
FormatterToXML::DOMStringMapType FormatterToXML::s_revhash;
FormatterToXML::DOMString2IntMapType FormatterToXML::s_revsize;
const DOMString FormatterToXML::convertMime2JavaEncoding(
const DOMString& mimeCharsetName)
{
if (m_javaEncodingIsISO) return mimeCharsetName;
DOMStringMapType::const_iterator it =
s_enchash.find(toUpperCase(mimeCharsetName));
return (*it).second;
}
const DOMString FormatterToXML::convertJava2MimeEncoding(
const DOMString& encoding)
{
if (m_javaEncodingIsISO) return encoding;
DOMStringMapType::const_iterator it =
s_revhash.find(toUpperCase(encoding));
return (*it).second;
}
void FormatterToXML::initEncodings()
{
if(0 != s_enchash.size())
return;
bool useISOPrefix = false;
/*
java:
try
{
java.io.ByteArrayOutputStream os = new java.io.ByteArrayOutputStream();
os.write(32);
String s = os.toString("ISO8859_1");
// Just in case it doesn't throw an exception...
if(null == s)
useISOPrefix = false;
else
useISOPrefix = true;
}
catch (java.io.UnsupportedEncodingException e)
{
useISOPrefix = false;
}
*/
// A bit of a hack for the blackdown VMs (and probably some others).
/*
java:
try
{
String encoding = System.getProperty("file.encoding");
int dashindex = (encoding != null ? encoding.indexOf('-') : -1);
if(3 == dashindex)
{
String ISOprefix = new String(encoding.toCharArray(), 0, 3);
if (ISOprefix.equals("ISO") == true)
javaEncodingIsISO = true;
}
}
catch(SecurityException se)
{
}
*/
// Make a table to maximum character sizes before we
// need to resort to escaping in the XML.
// TODO: To tell the truth, I'm guessing a bit here.
// s_revsize.insert(std::make_pair("CP1252", 0xFF)); // Windows Latin-1
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("WINDOWS-1250")), 0xFF)); // Windows 1250 Peter Smolik
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("UTF-8")), 0xFFFF)); // Universal Transformation Format 8
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")), 0x7F));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-3")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-4")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-5")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-6")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-7")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-8")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-JP")), 0xFFFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("SHIFT_JIS")), 0xFFFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EUC-JP")), 0xFFFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("GB2312")), 0xFFFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("BIG5")), 0xFFFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EUC-KR")), 0xFFFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-KR")), 0xFFFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("KOI8-R")), 0xFFFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-US")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CA")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NL")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-DK")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NO")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FI")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-SE")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IT")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ES")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-GB")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FR")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR1")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-HE")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CH")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ROECE")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-YU")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS")), 0xFF));
s_revsize.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2")), 0xFF));
// <preferred MIME name>, <Java encoding name>
// s_enchash.insert(std::make_pair("ISO 8859-1", "CP1252")); // Close enough, I guess
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("WINDOWS-1250")), DOMString(XALAN_STATIC_UCODE_STRING("CP1250")))); // Peter Smolik
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("UTF-8")), DOMString(XALAN_STATIC_UCODE_STRING("UTF8"))));
if(useISOPrefix)
{
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1")))); // ?
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_2"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-3")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_3"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-4")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_4"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-5")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_5"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-6")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_6"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-7")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_7"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-8")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_8"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9")),
DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_9"))));
}
else
{
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_1")))); // ?
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_1"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_2"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-3")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_3"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-4")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_4"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-5")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_5"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-6")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_6"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-7")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_7"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-8")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_8"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9")),
DOMString(XALAN_STATIC_UCODE_STRING("8859_9"))));
}
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-JP")), DOMString(XALAN_STATIC_UCODE_STRING("JIS"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("SHIFT_JIS")), DOMString(XALAN_STATIC_UCODE_STRING("SJIS"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EUC-JP")), DOMString(XALAN_STATIC_UCODE_STRING("EUCJIS"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("GB2312")), DOMString(XALAN_STATIC_UCODE_STRING("GB2312"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("BIG5")), DOMString(XALAN_STATIC_UCODE_STRING("Big5"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EUC-KR")), DOMString(XALAN_STATIC_UCODE_STRING("KSC5601"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-KR")), DOMString(XALAN_STATIC_UCODE_STRING("ISO2022KR"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("KOI8-R")), DOMString(XALAN_STATIC_UCODE_STRING("KOI8_R"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-US")), DOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CA")), DOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NL")), DOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-DK")), DOMString(XALAN_STATIC_UCODE_STRING("CP277"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NO")), DOMString(XALAN_STATIC_UCODE_STRING("CP277"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FI")), DOMString(XALAN_STATIC_UCODE_STRING("CP278"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-SE")), DOMString(XALAN_STATIC_UCODE_STRING("CP278"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IT")), DOMString(XALAN_STATIC_UCODE_STRING("CP280"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ES")), DOMString(XALAN_STATIC_UCODE_STRING("CP284"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-GB")), DOMString(XALAN_STATIC_UCODE_STRING("CP285"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FR")), DOMString(XALAN_STATIC_UCODE_STRING("CP297"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR1")), DOMString(XALAN_STATIC_UCODE_STRING("CP420"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-HE")), DOMString(XALAN_STATIC_UCODE_STRING("CP424"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CH")), DOMString(XALAN_STATIC_UCODE_STRING("CP500"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ROECE")), DOMString(XALAN_STATIC_UCODE_STRING("CP870"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-YU")), DOMString(XALAN_STATIC_UCODE_STRING("CP870"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS")), DOMString(XALAN_STATIC_UCODE_STRING("CP871"))));
s_enchash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2")), DOMString(XALAN_STATIC_UCODE_STRING("CP918"))));
// j:CNS11643 -> EUC-TW?
// ISO-2022-CN? ISO-2022-CN-EXT?
// <Java encoding name>, <preferred MIME name>
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP1252")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")))); // Close enough, I guess
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP1250")), DOMString(XALAN_STATIC_UCODE_STRING("windows-1250")))); // Peter Smolik
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("UTF8")), DOMString(XALAN_STATIC_UCODE_STRING("UTF-8"))));
//s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1")), DOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")))); // ?
if(useISOPrefix)
{
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_2")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_3")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-3"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_4")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-4"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_5")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-5"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_6")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-6"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_7")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-7"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_8")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-8"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO8859_9")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9"))));
}
else
{
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_1")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_2")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_3")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-3"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_4")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-4"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_5")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-5"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_6")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-6"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_7")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-7"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_8")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-8"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("8859_9")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9"))));
}
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("JIS")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-JP"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("SJIS")), DOMString(XALAN_STATIC_UCODE_STRING("Shift_JIS"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("EUCJIS")), DOMString(XALAN_STATIC_UCODE_STRING("EUC-JP"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("GB2312")), DOMString(XALAN_STATIC_UCODE_STRING("GB2312"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("BIG5")), DOMString(XALAN_STATIC_UCODE_STRING("Big5"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("KSC5601")), DOMString(XALAN_STATIC_UCODE_STRING("EUC-KR"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("ISO2022KR")), DOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-KR"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("KOI8_R")), DOMString(XALAN_STATIC_UCODE_STRING("KOI8-R"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP037")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-US"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP037")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CA"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP037")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NL"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP277")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-DK"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP277")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NO"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP278")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FI"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP278")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-SE"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP280")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IT"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP284")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ES"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP285")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-GB"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP297")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FR"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP420")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR1"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP424")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-HE"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP500")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CH"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP870")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ROECE"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP870")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-YU"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP871")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS"))));
s_revhash.insert(std::make_pair(DOMString(XALAN_STATIC_UCODE_STRING("CP918")), DOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2"))));
}