类似这样
或者这样,多了个双引号啥的
{\公众title\"大众:\"大众\"大众你好\公众}
由于数据库是Oracle,起初以为是Oracle这老古董出问题了,结果一番折腾,把每条写入数据的SQL语句都拿出来,看起来里面的JSON格式都没问题。
这也太诡异了吧,看起来没毛病,但就为啥JSON被随机截断呢?
末了我试着把整段SQL放在Rider的 query console 里面实行,然后再去数据库里读取这段JSON,居然创造变成这样了:
{\"大众title\"大众:\"大众?你好\"大众}
啊这,看到这个大大的问号,急速就能知道这个“你好”里面不止是这两个字,肯定含有不可见的Unicode字符。
然后把这段JSON复制出来,用16进制模式打开,果真看到在“你好”前面有一个 \u0020
的字符…
这里再附上部分 Unicode 表格
可以看到上面那个 \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参考资料