Apache 模块 mod_xml2enc

Description:对基于 libxml2 的过滤器模块的增强的字符集/国际化支持
Status:Base
Module Identifier:xml2enc_module
Source File:mod_xml2enc.c
Compatibility:2.4 版及更高版本。作为 2.2.x 版本的第三方模块可用

Summary

此模块为标记识别过滤器模块(例如mod_proxy_html)提供增强的国际化支持。它可以自动检测 Importing 数据的编码,并确保由libxml2解析器正确处理它们,包括在必要时转换为 Unicode(UTF-8)。它也可以在标记处理后将数据转换为选择的编码,并确保在 HTTP Content-Type Headers 中设置了正确的字符集值。

Usage

有两种使用场景:编程为可与 mod_xml2enc 一起使用的模块,以及不知道该模块的模块:

  • 为 mod_xml2enc 启用了过滤器模块

    • 诸如mod_proxy_html版本 3.1 及更高版本之类的模块使用xml2enc_charset可选函数来检索 charset 参数,以传递给 libxml2 解析器,并且可以使用xml2enc_filter可选函数将其后处理为另一种编码。将 mod_xml2enc 与启用的模块一起使用,无需进行任何配置:另一个模块将为您配置 mod_xml2enc(尽管您可能仍想使用以下配置指令来自定义它)。
  • Non-enabled modules

    • 要将其与未明确为 mod_xml2enc 启用的基于 libxml2 的模块一起使用,您必须自己配置过滤器链。因此,要将其与模块 mod_foo 提供的过滤器 foo 一起使用,以改善后者对 HTML 和 XML 的 i18n 支持,可以使用
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

mod_foo 现在将支持 libxml2 或 apr_xlate/iconv 中的一个(或两个)支持的任何字符集。

Programming API

鼓励程序员编写基于 libxml2 的过滤器模块,使其启用 mod_xml2enc 的功能,从而为用户提供强大的 i18n 支持,而无需花费很多精力。编程 API 在 mod_xml2enc.h 中公开,用法示例为mod_proxy_html

检测编码

mod_charset_lite不同,mod_xml2enc 设计用于处理其编码无法事先知道并因此进行了配置的数据。因此,它使用“嗅探”技术来检测 HTTP 数据的编码,如下所示:

  • 如果 HTTP Content-Type Headers 包含 charset 参数,则使用该参数。

  • 如果数据以 XML 字节 Sequences 标记(BOM)或 XML 编码声明开头,则使用该格式。

  • 如果在 HTML <META>元素中声明了编码,则使用该编码。

  • 如果以上都不匹配,则使用由xml2EncDefault设置的默认值。

规则按 Sequences 应用。一旦找到匹配项,将使用该匹配项并停止检测。

Output Encoding

libxml2始终在内部使用 UTF-8(Unicode),默认情况下,基于 libxml2 的过滤器模块将输出该代码。 mod_xml2enc 可以通过 API 更改输出编码,但是目前尚无法直接配置该编码。

至少从理论上讲,不必更改输出编码,并且由于不必要的转换会给服务器带来额外的处理负担,因此不建议更改输出编码。

Unsupported Encodings

如果您正在使用平台上可用的任何转换方法都不支持的编码,则仍可以使用xml2EncAlias将它们别名为支持的编码。

xml2EncAlias Directive

Description:识别用于编码值的别名
Syntax:xml2EncAlias charset alias [alias ...]
Context:server config
Status:Base
Module:mod_xml2enc

此服务器范围的指令将一个或多个编码别名为另一种编码。这使得 libxml2 无法识别的编码可以由 libxml2 的编码支持在内部使用转换表进行识别的编码处理。这有两个目的:支持 libxml2 或 iconv 不能识别的字符集(或名称),以及跳过不必要的编码转换。

xml2EncDefault Directive

Description:设置默认编码以假定绝对没有信息可以是automatically detected
Syntax:xml2EncDefault name
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Base
Module:mod_xml2enc

如果您正在处理具有已知编码但没有编码信息的数据,则可以设置此默认值以帮助 mod_xml2enc 正确处理数据。例如,要使用 HTTP/1.0 中指定的默认值 Latin1(iso-8859-1),请使用:

xml2EncDefault iso-8859-1

xml2StartParse Directive

Description:建议解析器跳过主要垃圾。
Syntax:xml2StartParse element [element ...]
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Base
Module:mod_xml2enc

指定标记解析器应从任何指定元素的第一个实例开始。这可以用作变通方法,其中后端断开时会插入导致分析器(example here)混乱的主要垃圾。

永远不要将其用于 XML 或格式正确的 HTML。