文件编码和内容类型

平台运行时插件定义基础结构以用于定义和发现数据流的内容类型。(有关内容框架的概述,请参阅内容类型。)对不同种类的内容指定不同编码(字符集)的功能是内容类型系统的一个重要组成部分。而且资源 API 还允许对项目、文件夹和文件建立缺省字符集。如果文件内容本身未在其数据流中定义特定编码,将参阅这些缺省字符集。

设置字符集

我们已经在内容类型中见到可对内容类型建立缺省文件编码。资源 API 提供了更细粒度的控制。

IContainer 定义了用于对特定项目或文件夹设置缺省字符集的协议。这允许插件(最终即用户)在内容类型中的缺省字符集不适合的情况下确定适合文件集合的字符集时有更多的自由。

IFile 定义了用于对特定文件设置缺省字符集的 API。如果未在文件内容中指定任何编码,将使用此字符集。文件的缺省字符集优先于在文件的文件夹、项目或内容类型中指定的任何缺省字符集。

在资源的属性页面中为最终用户同时提供了这两个功能部件。

查询字符集

IFile 还定义了用于查询文件的字符集的 API。布尔标志指定是否仅应返回对该文件显式定义的字符集或者是否应返回隐含的字符集。例如:

	String charset = myFile.getCharset(false);

如果未在 myFile 上显式设置任何字符集,则返回空。但是,

	String charset = myFile.getCharset(true);

会先检查对文件显式设置的字符集。如果找不到,则检查文件的内容以获取该字符集的描述。如果还是找不到,则检查文件的包含文件夹和项目以获取缺省字符集。如果仍然找不到,则检查对该内容类型本身定义的缺省字符集。最后,如果未指定任何其它缺省字符集,将返回平台缺省字符集。便利方法 getCharset() 与使用 getCharset(true) 的效果一样。

工作空间中的文件的内容类型

对于工作空间中的文件来说,IFile 提供了用于获取文件内容描述的 API:

IFile file = ...;
IContentDescription description = file.getDescription();

即使客户机只对确定内容类型感兴趣,也应该使用此 API - 可以根据内容描述轻易地获取内容类型。可以通过获取内容和名称并使用使用内容类型中描述的 API 来检测内容类型或描述文件,但不建议这样做。使用 IFile.getContentDescription() 来确定内容类型时会考虑项目性质和特定于项目的设置。如果直接转到内容类型管理器,就会忽略那些信息。而更重要的一点是,从磁盘读取文件内容的成本非常高。资源插件为工作空间中的文件维护内容描述高速缓存。这将内容描述的成本降低到可接受的级别。