栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Gson Unicode字符转换为Unicode字符代码

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Gson Unicode字符转换为Unicode字符代码

不幸的是,Gson似乎不支持它。所有JSON输入/输出分别集中在Gson(从2.8.0开始)

JsonReader
JsonWriter
JsonReader
可以使用其私有
readEscapeCharacter
方法读取Unipre转义。但是,与有所不同的是
JsonReader
JsonWriter
只需将字符串写入后备
Writer
实例,除了
u2028
和以外,不对127以上的字符进行字符校正
u2029
。可能唯一可以做的是编写自定义转义符,
Writer
以便发出Unipre转义。

final class EscapedWriter        extends Writer {    private static final char[] hex = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'    };    private final Writer writer;    // I/O components are usually implemented in not thread-safe manner    // so we can save some time on constructing a single UTF-16 escape    private final char[] escape = { '\', 'u', 0, 0, 0, 0 };    EscapedWriter(final Writer writer) {        this.writer = writer;    }    // This implementation is not very efficient and is open for enhancements:    // * constructing a single "normalized" buffer character array so that it could be passed to the downstream writer    //   rather than writing characters one by one    // * etc...    @Override    public void write(final char[] buffer, final int offset, final int length) throws IOException {        for ( int i = offset; i < length; i++ ) { final int ch = buffer[i]; if ( ch < 128 ) {     writer.write(ch); } else {     escape[2] = hex[(ch & 0xF000) >> 12];     escape[3] = hex[(ch & 0x0F00) >> 8];     escape[4] = hex[(ch & 0x00F0) >> 4];     escape[5] = hex[ch & 0x000F];     writer.write(escape); }        }    }    @Override    public void flush() throws IOException {        writer.flush();    }    @Override    public void close() throws IOException {        writer.close();    }    // Some java.io.Writer subclasses may use java.lang.Object.toString() to materialize their accumulated state by design    // so it has to be overridden and forwarded as well    @Override    public String toString() {        return writer.toString();    }}

该作家未经充分测试,不尊重

u2028
u2029
。然后只需在调用
toJson
方法时配置输出目标即可:

final String input = "{"description":"Tikrovi\u0161kai para\u0161ytas k\u016brinys"}";final Book book = gson.fromJson(input, Book.class);final Writer output = new EscapedWriter(new StringWriter());gson.toJson(book, output);System.out.println(input);System.out.println(output);

输出:

{“描述”:“ Tikrovi u016​​1ytas k u016​​brinys”}

这是一个有趣的问题,您可能还会在google /
gson
上提出一个问题,以添加字符串编写配置选项-
或至少从开发团队那里获得一些意见。我确实相信他们非常了解这种行为,并通过设计使它像这样工作,但是他们也可以对此有所了解(我现在唯一想到的是,他们目前有更多的性能,无法再增加在编写字符串之前进行转换,但这是一个微不足道的猜测)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373823.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号