将特殊字符写入yaml文件

时间:2020-10-03 12:08:44

标签: java yaml snakeyaml

我使用snakeyaml 1.27

我想在Yaml文件中写特殊字符:

section.put("Success", "\uD83D\uDE03"); ?
section.put("Warning", "\uD83D\uDE2E"); ?
section.put("Error", "\uD83D\uDE26"); ?

但输出是

  Success: ?
  Warning: ?
  Error: ?

  Success: "\U0001f603"
  Warning: "\U0001f62e"
  Error: "\U0001f626"

如果我改变 DumperOptions().setAllowUnicode(true/false);

如果我只是读写Yaml,则会出现相同的情况。 它能够读取?但不能将其写回。

代码:

DumperOptions o = new DumperOptions();
o.setPrettyFlow(true);
o.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
o.setAllowUnicode(true);

Yaml yaml = new Yaml(o);
InputStream is = new FileInputStream(file);
Map<String, Object> data = yaml.load(is);
is.close();

StringWriter writer = new StringWriter();
yaml.dump(data, writer);

FileWriter fw = new FileWriter(file);
fw.write(writer.toString());
fw.close();

之前的Yaml:

Bot_Token: f1432d2asdummy
Owner_ID: '123456'
Command_Trigger: '-'
Game: Ready  playing music. !Play
Emojis:
  Success: ?
  Warning: ?
  Error: ?

之后的Yaml:

Bot_Token: f1432d2asd3dummy
Owner_ID: '123456'
Command_Trigger: '-'
Game: Ready  playing music. !Play
Emojis:
  Success: ?
  Warning: ?
  Error: ?

2 个答案:

答案 0 :(得分:0)

FileWriter替换为newBufferdWriter()

DumperOptions o = new DumperOptions();
o.setPrettyFlow(true);
o.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
o.setAllowUnicode(true);

Yaml yaml = new Yaml(o);
InputStream is = new FileInputStream(file);

Map<String, Object> data = yaml.load(is);
is.close();

StringWriter writer = new StringWriter();
yaml.dump(data, writer);

BufferedWriter bw = Files.newBufferedWriter(file.toPath());
bw.write(writer.toString());
bw.close();

答案 1 :(得分:0)

YAML是一种文本格式。这意味着您不能安全地将任何二进制文件写入YAML文件,而只能编写可打印字符。

如果您确实要编写二进制文件,请使用Base64编码二进制文件或编写十六进制字节的字符串,然后让其他程序使用您选择的格式。

由于您似乎要编写表情符号字符,因此您正在编写文本,而不是二进制文件;但是,您的文本是以UTF格式之一(可能是UTF8)编码的。 YAML支持大多数UTF格式(可能全部);但是,为确保将YAML视为UTF,您需要添加适合所需格式的BOM(字节顺序标记)。这通常不会保留在“读取数据”中,因此也许您唯一的问题不是重新创建/将其写入输出流。

查找BOM表并在十六进制编辑器中打开输入和输出。如果是这种情况,那么您将能够找到很多其他文章,内容涉及如何将所选BOM写入输出流。

相关问题