类似这样

{\"大众title\"大众: \"大众你好

或者这样,多了个双引号啥的

{\公众title\"大众:\"大众\"大众你好\公众}

由于数据库是Oracle,起初以为是Oracle这老古董出问题了,结果一番折腾,把每条写入数据的SQL语句都拿出来,看起来里面的JSON格式都没问题。

jsp显示json数据被截断C移除字符串中的弗成见Unicode字符 Java

这也太诡异了吧,看起来没毛病,但就为啥JSON被随机截断呢?

末了我试着把整段SQL放在Rider的 query console 里面实行,然后再去数据库里读取这段JSON,居然创造变成这样了:

{\"大众title\"大众:\"大众?你好\"大众}

啊这,看到这个大大的问号,急速就能知道这个“你好”里面不止是这两个字,肯定含有不可见的Unicode字符。

然后把这段JSON复制出来,用16进制模式打开,果真看到在“你好”前面有一个 \u0020 的字符…

2Unicode码表
0000-007F:C0掌握符及基本拉丁文 (C0 Control and Basic Latin)
0080-00FF:C1掌握符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)
0100-017F:拉丁文扩展-A (Latin Extended-A)
0180-024F:拉丁文扩展-B (Latin Extended-B)
0250-02AF:国际音标扩展 (IPA Extensions)
02B0-02FF:空缺润色字母 (Spacing Modifiers)
……

这里再附上部分 Unicode 表格

U+0123456789ABCDEF0000NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSI0010DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS0020!\"大众#$%&'()+,-./00300123456789:;<=>?0040@ABCDEFGHIJKLMNO0050PQRSTUVWXYZ[\]^_0060`abcdefghijklmno

可以看到上面那个 \u0020 在第三行第一列,是一个不可见字符,躲在标题的前面

也便是由于这个 Unicode 字符,Oracle无法精确解析,以是导致了插入数据的时候错乱了

以是破案了,便是系统前台利用职员,在输入的时候不知道咋滴搞了个Unicode字符进去…

办理方法便是我这边采集的时候再做一次过滤…

没想到C#要搞个过滤 Unicode 还挺折腾的,资料太少…

末了还是参考了Java的资料搞的。
= =...

3代码

代码如下

写了个扩展方法来过滤

public static class StringExt { // 掌握字符private static readonly Regex ControlCharRegex = new Regex(@\公众[\p{C}]\"大众, RegexOptions.Compiled);/// <summary>/// 移除掌握字符/// </summary>public static string RemoveControlChars(this string text) {return ControlCharRegex.Replace(text, string.Empty); }}

要利用的时候就这样

var outStr = \"大众带有Unicode的字符串\公众.RemoveControlChars();

搞定。

4参考资料
UniCode编码表及部分不可见字符过滤方案 - https://www.cnblogs.com/fan-yuan/p/8176886.html
https://stackoverflow.com/questions/6198986/how-can-i-replace-non-printable-unicode-characters-in-java