`

java.util.Properties使用ISO 8859-1字符集编码读取.properties属性文件

    博客分类:
  • Java
阅读更多

如果我们的属性配置文件中含有中文的话,我们一使用java.util.Properties直 接读取时会出乱码,现打开API读了一下,它是使用ISO 8859-1字符集编码来读取属性配置文件的,这样肯定会出乱码啊,这就解解释了为什么Struts中国际化文本中含有中文时,为什么要使用 native2ascii来把那些非ASCII字符转换成Unicode表示形式,如“提”转换后为 \u63d0 。以下是API说明部分:

When saving properties to a stream or loading them from a stream, the ISO 8859-1 character encoding is used. For characters that cannot be directly represented in this encoding, Unicode escapes are used; however, only a single 'u' character is allowed in an escape sequence. The native2ascii tool can be used to convert property files to and from other character encodings.


下面是源码:

BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "8859_1"));

 

public void load(InputStream inStream)需要注意的地方:
字符和字符串所用的字符转义序列的差别有:
—>不识别八进制转义。
—>字符序列 \b 不表示退格字符(根据下面的解释就是 b)
—>该方法并不将无效转义字符前的反斜杠字符 \ 视为错误;只是将反斜杠丢弃。例如,在 Java 字符串中,序列 "\z" 将导致编译时错误。相反,此方法会丢弃该反斜杠。因此,该方法将两字符序列 "\b" 与单字符 'b' 视为等同。
—>转义序列对于单引号和双引号而言不是必需的;但是根据上面的规则,前面有反斜杠的单引号和双引号字符仍旧分别生成单引号和双引号字符。
如果输入中出现了错误的 Unicode 转义序列,则抛出 IllegalArgumentException。

属性文件中是以自然行(而不是手写的 \r \n \r\n)为单位来处理的。一个自然行可能是一个空行、注释行或保存了键-元素对的某些部分。键与值只可能在一个自然行中出现,那么,如果键或值本身需要跨多行该怎么办?方法是用反斜杠字符 \ 转义行结束符序列(如手写 \r \n \r\n)。

仅包含空白字符的自然行认为是空行并被忽略。注释行以 ASCII 字符 '#' 或 '!' 作为其首个非空白字符;除了行结束符,此方法还将空格字符(' ','\u0020')、制表符('\t','\u0009')和换页符('\f','\u000C')作为空白,类中是这样定义的:whiteSpaceChars = " \t\r\n\f";

键是从首个非空白字符开始,直到(但不包括)首个非转义的 '='、 ':' 或非行结束符(\r\n)的空白字符(所以"a b"转成键值对"a=b"),但这些键终止字符都可能包含在键中,方法是在其前面用反斜杠字符进行转义,例如:\:\= 将是两字符的键 ":="。键可以使用 \r 和 \n 转义序列包括行结束符字符。键后面的所有空白字符将跳过;如果键后的首个非空白字符是 '=' 或 ':',则忽略该字符并且跳过其后的所有空白字符。行中所有剩余的字符都成为值;如果没有剩余的字符,则该元素为空字符串 ""。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics