【问题标题】:Escaping - character when reading from Java properites转义 - 从 Java 属性读取时的字符
【发布时间】:2018-08-30 22:38:10
【问题描述】:

我正在尝试从 Java 属性文件中读取 - 值,但它一直给我值 â 和类似 epsilon 的东西(粘贴时遇到问题)

我在逃避 " 时没有任何问题,但似乎无论我做什么 - 都会给我带来问题。我尝试了 '-' 和 \- 和 \\- 但似乎没有任何效果。

@Test
public void readFromProperties() throws IOException {
    Properties options = new Properties();

    FileInputStream in = new FileInputStream(Configs.optionsFi);
    negComments.load(in);
    in.close();

    String option = options.getProperty("OPTION8");
    System.out.println(negComment);
}

属性文件:

OPTION8=asdf asdf asdf asdf asdf – \"asdfasdf\"

System.out.println 结果:

asdf asdf asdf asdf asdf âepsilonlikething "asdfasdf"

【问题讨论】:

  • 在您的示例中,option 等于好的字符串值,但 system.out.println 是一个奇怪的结果。但是,您在系统中打印的不是option,而是称为negComment 的东西。这是为什么?它在哪里定义\创建?

标签: java character-encoding escaping properties-file


【解决方案1】:

属性文件中的 字符不是普通的破折号('HYPHEN-MINUS' (U+002D)),而是'EN DASH' (U+2013)

load(InputStream inStream) 的文档明确指定:

输入流采用 load(Reader) 中指定的简单的面向行的格式,并假定使用 ISO 8859-1 字符编码;即每个字节是一个 Latin1 字符。

您的属性文件是 UTF-8 格式,因此您会收到字符编码错误。

有3种方法可以解决问题:

  1. 假设您打算使用普通破折号,请将 替换为 -,
    并确保将文件保存在 ISO 8859-1 aka Latin1 aka Windows-1252 中。

  2. 对字符进行编码,即将替换为\u2013,
    并确保将文件保存在 ISO 8859-1 aka Latin1 aka Windows-1252 中。

  3. 使用 UTF-8 读取文件:

    try (BufferedReader in = Files.newBufferedReader(Paths.get(Configs.optionsFi))) {
        options.load(in);
    }
    

【讨论】:

  • 谢谢!编码只是让我发疯。选项 3 按预期工作。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多