On this page
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(尽管您可能仍想使用以下配置指令来自定义它)。
- 诸如mod_proxy_html版本 3.1 及更高版本之类的模块使用
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。