今天我的一位测试人员来找我说我的程序未通过测试。读取属性文件时,我们是否需要检查编码方案?
她所做的一切实际上是打开我所有的属性文件并将它们保存为Unicode格式。
问题:
- 是否有行业惯例检查每一个属性文件的编码类型?
- 你如何处理这个问题?
我从来没有见过任何java项目正在运行编码检查属性文件之前。但我看到她的观点,因为客户可能会以不同的编码类型保存属性文件。
今天我的一位测试人员来找我说我的程序未通过测试。读取属性文件时,我们是否需要检查编码方案?
她所做的一切实际上是打开我所有的属性文件并将它们保存为Unicode格式。
问题:
我从来没有见过任何java项目正在运行编码检查属性文件之前。但我看到她的观点,因为客户可能会以不同的编码类型保存属性文件。
属性文件是否被视为应用程序的一部分或用户可编辑文件的一部分。在第一种情况下,我不认为对应用程序的某些部分进行编码或存储的假设是错误的。
如果属性文件是以用户为目标的用户可编辑文件,那么这个原则适用:您应该验证并清除从应用程序外部进入的所有输入。
官方java.util.Properties
文档声明编码在ISO-8859-1
。
将属性保存到流中或从流中加载它们时,将使用ISO 8859-1字符 编码。对于在此编码中不能直接表示的字符,使用 Unicode转义符;然而,在转义 序列中只允许一个'u'字符。 native2ascii工具可用于将属性文件转换为其他 字符编码。
这可以是found here。
尽管该规范允许在属性文件中使用Latin-1,但通常的做法是ASCII。
所有其他字符集需要转换为ASCII使用native2ascii
是安全的。
当我们开始使用本地编码时,我们遇到了相同的问题,其中一些使用了Latin-1,另一些使用UTF-8编码,并且它们不兼容。所以留在ASCII。
正如其他人所说,使用流读取的属性文件的编码固定在ISO-8859-1。你不能真正地验证这个非常容易 - 尽管检查文件是否以UTF-8字节顺序标记开头并不是一个坏主意。
从Java 6开始,您可以将Reader
提供给Properties.load,而不是Stream
。如果它仍然是一个选项,你可能可能想要开始使用它和授权 UTF-8,这是很多人使用比ISO-8859-1和\uxxxx
转义更容易。
使用native2ascii java实用程序让您的属性文件处于正确的状态。
我的问题是,我的用户可能会篡改属性文件并将其保存为其他编码格式。我们是否需要为此进行检查? – janetsmith 2009-09-23 05:22:44
我认为你必须假设要编辑属性文件的用户有意识将其保存在正确的编码中。只有这么多你可以做,以保护用户免受他们不明白的东西搞乱的结果... – 2009-09-23 06:44:27
我已经添加了一些上面关于用户可编辑文件的答案,以及属性文件的意图。 – Stef 2009-09-23 14:57:23