我使用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: ?
答案 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写入输出流。