<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>mod_xml2enc - Apache HTTP Server Version 2.4</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet">
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size">
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css"><link rel="stylesheet" type="text/css" href="../style/css/prettify.css">
<script src="../style/scripts/prettify.min.js">
</script>

<link href="../images/favicon.png" rel="shortcut icon"></head>
<body>
<div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Report a bug</a></p>
<p class="apache">Apache HTTP Server Version 2.4</p>
<img alt="" src="../images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif"></a></div>
<div id="path">
<a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">HTTP Server</a> &gt; <a href="https://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">Modules</a></div>
<div id="page-content">
<div id="preamble"><h1>Apache Module mod_xml2enc</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>Available Languages: </span><a href="../en/mod/mod_xml2enc.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_xml2enc.html" hreflang="fr" rel="alternate" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a></p>
</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Enhanced charset/internationalisation support for libxml2-based
filter modules</td></tr>
<tr><th><a href="module-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Module&nbsp;Identifier:</a></th><td>xml2enc_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">Source&nbsp;File:</a></th><td>mod_xml2enc.c</td></tr>
<tr><th><a href="module-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later.  Available as a third-party module
for 2.2.x versions</td></tr></table>
<h3>Summary</h3>

    <p>This module provides enhanced internationalisation support for
    markup-aware filter modules such as <code class="module"><a href="../mod/mod_proxy_html.html">mod_proxy_html</a></code>.
    It can automatically detect the encoding of input data and ensure
    they are correctly processed by the <a href="http://xmlsoft.org/">libxml2</a> parser, including converting to Unicode (UTF-8) where
    necessary.  It can also convert data to an encoding of choice
    after markup processing, and will ensure the correct <var>charset</var>
    value is set in the HTTP <var>Content-Type</var> header.</p>
</div>
<div id="quickview"><h3>Topics</h3>
<ul id="topics">
<li><img alt="" src="../images/down.gif"> <a href="#usage">Usage</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#api">Programming API</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#sniffing">Detecting an Encoding</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#output">Output Encoding</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#alias">Unsupported Encodings</a></li>
</ul><h3 class="directives">Directives</h3>
<ul id="toc">
<li><img alt="" src="../images/down.gif"> <a href="#xml2encalias">xml2EncAlias</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#xml2encdefault">xml2EncDefault</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#xml2startparse">xml2StartParse</a></li>
</ul>
<h3>Bugfix checklist</h3><ul class="seealso"><li><a href="https://www.apache.org/dist/httpd/CHANGES_2.4">httpd changelog</a></li><li><a href="https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__open__&amp;list_id=144532&amp;product=Apache%20httpd-2&amp;query_format=specific&amp;order=changeddate%20DESC%2Cpriority%2Cbug_severity&amp;component=mod_xml2enc">Known issues</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&amp;component=mod_xml2enc">Report a bug</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="usage">Usage <a title="Permanent link" href="#usage" class="permalink">&para;</a></h2>
    <p>There are two usage scenarios: with modules programmed to work
    with mod_xml2enc, and with those that are not aware of it:</p>
    <dl>
    <dt>Filter modules enabled for mod_xml2enc</dt><dd>
    <p>Modules such as <code class="module"><a href="../mod/mod_proxy_html.html">mod_proxy_html</a></code> version 3.1
    and up use the <code>xml2enc_charset</code> optional function to retrieve
    the charset argument to pass to the libxml2 parser, and may use the
    <code>xml2enc_filter</code> optional function to postprocess to another
    encoding.  Using mod_xml2enc with an enabled module, no configuration
    is necessary: the other module will configure mod_xml2enc for you
    (though you may still want to customize it using the configuration
    directives below).</p>
    </dd>
    <dt>Non-enabled modules</dt><dd>
    <p>To use it with a libxml2-based module that isn't explicitly enabled for
    mod_xml2enc, you will have to configure the filter chain yourself.  So to
    use it with a filter <strong>foo</strong> provided by a module
    <strong>mod_foo</strong> to improve the latter's i18n support with HTML and
    XML, you could use</p>
    <pre><code>
    FilterProvider iconv    xml2enc Content-Type $text/html
    FilterProvider iconv    xml2enc Content-Type $xml
    FilterProvider markup   foo Content-Type $text/html
    FilterProvider markup   foo Content-Type $xml
    FilterChain     iconv markup
    </code></pre>
    <p><strong>mod_foo</strong> will now support any character set supported by either
    (or both) of libxml2 or apr_xlate/iconv.</p>
    </dd></dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="api">Programming API <a title="Permanent link" href="#api" class="permalink">&para;</a></h2>
    <p>Programmers writing libxml2-based filter modules are encouraged to
    enable them for mod_xml2enc, to provide strong i18n support for your
    users without reinventing the wheel.  The programming API is exposed in
    <var>mod_xml2enc.h</var>, and a usage example is
    <code class="module"><a href="../mod/mod_proxy_html.html">mod_proxy_html</a></code>.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="sniffing">Detecting an Encoding <a title="Permanent link" href="#sniffing" class="permalink">&para;</a></h2>
    <p>Unlike <code class="module"><a href="../mod/mod_charset_lite.html">mod_charset_lite</a></code>, mod_xml2enc is designed
    to work with data whose encoding cannot be known in advance and thus
    configured.  It therefore uses 'sniffing' techniques to detect the
    encoding of HTTP data as follows:</p>
    <ol>
        <li>If the HTTP <var>Content-Type</var> header includes a
        <var>charset</var> parameter, that is used.</li>
        <li>If the data start with an XML Byte Order Mark (BOM) or an
        XML encoding declaration, that is used.</li>
        <li>If an encoding is declared in an HTML <code>&lt;META&gt;</code>
        element, that is used.</li>
        <li>If none of the above match, the default value set by
        <code class="directive">xml2EncDefault</code> is used.</li>
    </ol>
    <p>The rules are applied in order.  As soon as a match is found,
    it is used and detection is stopped.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="output">Output Encoding <a title="Permanent link" href="#output" class="permalink">&para;</a></h2>
<p><a href="http://xmlsoft.org/">libxml2</a> always uses UTF-8 (Unicode)
internally, and libxml2-based filter modules will output that by default.
mod_xml2enc can change the output encoding through the API, but there
is currently no way to configure that directly.</p>
<p>Changing the output encoding should (in theory, at least) never be
necessary, and is not recommended due to the extra processing load on
the server of an unnecessary conversion.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="alias">Unsupported Encodings <a title="Permanent link" href="#alias" class="permalink">&para;</a></h2>
<p>If you are working with encodings that are not supported by any of
the conversion methods available on your platform, you can still alias
them to a supported encoding using <code class="directive">xml2EncAlias</code>.</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="xml2encalias"><span id="xml2EncAlias">xml2EncAlias</span> Directive <a title="Permanent link" href="#xml2encalias" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Recognize Aliases for encoding values</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>xml2EncAlias <var>charset alias [alias ...]</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_xml2enc</td></tr>
</table>
    <p>This server-wide directive aliases one or more encoding to another
    encoding.  This enables encodings not recognized by libxml2 to be handled
    internally by libxml2's encoding support using the translation table for
    a recognized encoding.  This serves two purposes: to support character sets
    (or names) not recognized either by libxml2 or iconv, and to skip
    conversion for an encoding where it is known to be unnecessary.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="xml2encdefault"><span id="xml2EncDefault">xml2EncDefault</span> Directive <a title="Permanent link" href="#xml2encdefault" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets a default encoding to assume when absolutely no information
can be <a href="#sniffing">automatically detected</a></td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>xml2EncDefault <var>name</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_xml2enc</td></tr>
</table>
    <p>If you are processing data with known encoding but no encoding
    information, you can set this default to help mod_xml2enc process
    the data correctly.  For example, to work with the default value
    of Latin1 (<var>iso-8859-1</var>) specified in HTTP/1.0, use:</p>
    <pre class="prettyprint lang-config">xml2EncDefault iso-8859-1</pre>


</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="xml2startparse"><span id="xml2StartParse">xml2StartParse</span> Directive <a title="Permanent link" href="#xml2startparse" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Advise the parser to skip leading junk.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>xml2StartParse <var>element [element ...]</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_xml2enc</td></tr>
</table>
    <p>Specify that the markup parser should start at the first instance
    of any of the elements specified.  This can be used as a workaround
    where a broken backend inserts leading junk that messes up the parser (<a href="http://bahumbug.wordpress.com/2006/10/12/mod_proxy_html-revisited/">example here</a>).</p>
    <p>It should never be used for XML, nor well-formed HTML.</p>

</div>
</div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/mod/mod_xml2enc.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_xml2enc.html" hreflang="fr" rel="alternate" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2026 The Apache Software Foundation.<br>Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Report a bug</a></p></div><script><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
var langToggle = document.querySelector('.lang-toggle');
var topLang = document.querySelector('.toplang');
if (langToggle && topLang) {
    langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); });
}
var qv = document.getElementById('quickview');
if (qv) {
    document.body.appendChild(qv);
    var qvBtn = document.createElement('button');
    qvBtn.className = 'qv-toggle';
    qvBtn.setAttribute('aria-label', 'Toggle page navigation');
    qvBtn.innerHTML = '&#9776;';
    document.body.appendChild(qvBtn);
    qvBtn.addEventListener('click', function() {
        var isOpen = qv.classList.toggle('open');
        if (isOpen) {
            qv.style.top = window.scrollY + 10 + 'px';
        }
    });
    window.addEventListener('scroll', function() { qv.classList.remove('open'); });
}
//--><!]]></script>
</body></html>