如何解决将特殊字符写入yaml文件
我使用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: ?
解决方法
将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();
,
YAML是一种文本格式。这意味着您不能安全地将任何二进制文件写入YAML文件,而只能编写可打印字符。
如果您确实要编写二进制文件,请使用Base64编码二进制文件或编写十六进制字节的字符串,然后让其他程序使用您选择的格式。
由于您似乎要编写表情符号字符,因此您正在编写文本,而不是二进制文件;但是,您的文本是以UTF格式之一(可能是UTF8)编码的。 YAML支持大多数UTF格式(可能全部);但是,为确保将YAML视为UTF,您需要添加适合所需格式的BOM(字节顺序标记)。这通常不会保留在“读取数据”中,因此也许您唯一的问题不是重新创建/将其写入输出流。
查找BOM表并在十六进制编辑器中打开输入和输出。如果是这种情况,那么您将能够找到很多其他文章,内容涉及如何将所选BOM写入输出流。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。