C#移除字符串中的不可见Unicode字符

c#,移除,字符串,不可,unicode,字符 · 浏览次数 : 1045

小编点评

**原因分析:** 由于 JSON 中包含不可见字符,导致 SQL 解析器无法正确解析,因此 JSON 数据被截断。 **解决方案:** 1. **过滤控制字符:**使用正则表达式 `ControlCharRegex` 中的 `\p{C}` 匹配所有控制字符。然后,使用 `string.IsNullOrEmpty()` 检查匹配结果,如果匹配,就删除它。 2. **使用 Unicode 编码:**在对 JSON 字符串进行处理之前,将其转换为 Unicode 编码。这确保所有字符都处于可打印的范围,并可以正常解析。 3. **使用 C# 或 Java 的过滤器:**在 C# 或 Java 中,可以使用 `string.IsNullOrEmpty()` 或 `Unicode.IsHighSurrogate()` 等方法来检测字符串中是否包含不可打印字符。如果包含,则进行处理。 **代码示例:** ```csharp public static string RemoveControlChars(this string text) { // 使用正则表达式匹配所有控制字符 string controlChars = ControlCharRegex.Replace(text, string.Empty); // 使用 Unicode 编码 text = text.Normalize(); // 使用 C# 的IsNullOrEmpty 方法检测字符串是否为空 if (string.IsNullOrEmpty(text)) { return string.Empty; } return text; } ``` **注意:** * `string.IsNullOrEmpty()` 方法会忽略空白字符串。 * `Unicode.IsHighSurrogate()` 方法仅适用于 Unicode 编码的字符。 * 这只是一个示例代码,您可以根据您的实际需求进行修改。

正文

背景

最近发现某个数据采集的系统拿下来的数据,有些字段的JSON被莫名截断了,导致后续数据分析的时候解析JSON失败。

类似这样

{"title": "你好

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

{"title":""你好"}

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

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

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

{"title":"?你好"}

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

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

Unicode码表

  • 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+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
0010 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
0020 ! " # $ % & ' ( ) * + , - . /
0030 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
0040 @ A B C D E F G H I J K L M N O
0050 P Q R S T U V W X Y Z [ \ ] ^ _
0060 ` a b c d e f g h i j k l m n o

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

也就是因为这个 Unicode 字符,Oracle无法正确解析,所以导致了插入数据的时候错乱了

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

解决方法就是我这边采集的时候再做一次过滤…

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

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

代码

代码如下

写了个扩展方法来过滤

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();

搞定。

参考资料

与C#移除字符串中的不可见Unicode字符相似的内容:

C#移除字符串中的不可见Unicode字符

背景 最近发现某个数据采集的系统拿下来的数据,有些字段的JSON被莫名截断了,导致后续数据分析的时候解析JSON失败。 类似这样 {"title": "你好 或者这样,多了个双引号啥的 {"title":""你好"} 因为数据库是Oracle,起初以为是Oracle这老古董出问题了,结果一番折腾,把

极速进化,光速转录,C++版本人工智能实时语音转文字(字幕/语音识别)Whisper.cpp实践

业界良心OpenAI开源的Whisper模型是开源语音转文字领域的执牛耳者,白璧微瑕之处在于无法通过苹果M芯片优化转录效率,Whisper.cpp 则是 Whisper 模型的 C/C++ 移植版本,它具有无依赖项、内存使用量低等特点,重要的是增加了 Core ML 支持,完美适配苹果M系列芯片。

FreeRTOS简单内核实现2 双向链表

FreeRTOS 的 list.c / list.h 文件中有 3 个数据结构、2 个初始化函数、2 个插入函数、1 个移除函数和一些宏函数,链表是 FreeRTOS 中的重要数据结构

LRU缓存替换策略及C#实现

LRU缓存替换策略 缓存是一种非常常见的设计,通过将数据缓存到访问速度更快的存储设备中,来提高数据的访问速度,如内存、CPU缓存、硬盘缓存等。 但与缓存的高速相对的是,缓存的成本较高,因此容量往往是有限的,当缓存满了之后,就需要一种策略来决定将哪些数据移除出缓存,以腾出空间来存储新的数据。 这样的策

Keil一键添加.c文件和头文件路径脚本--可遍历添加整个文件夹

最近想移植个LVGL玩玩,发现文件实在是太多了,加的手疼都没搞完,实在不想搞了就去找脚本和工具,基本没找到一个。。。。。。 主要是自己也懒得去研究写脚本,偶然搜到了一个博主写的脚本,原博客地址:https://blog.csdn.net/riyue2044/article/details/13942

【OpenVINO™】基于 C# 和 OpenVINO™ 部署 Blazeface 模型实现人脸检测

Blazeface模型是Google推出的一款专为移动GPU推理量身定制的轻量级且性能卓越的人脸检测器,BlazeFace 在旗舰移动设备上以200-1000 + FPS的速度运行。 在本文中,我们将使用OpenVINO™ C# API 部署 Blazeface 实现人脸检测。

【算法】游戏中的学习,使用c#面向对象特性控制游戏角色移动

最近,小悦的生活像是一首繁忙的交响曲,每天忙得团团转,虽然她的日程安排得满满当当,但她并未感到充实。相反,她很少有时间陪伴家人,这让她感到有些遗憾。在周五的午后,小悦的哥哥突然打来电话,他的声音里充满了焦虑。 “小悦,我有个事情想拜托你。”哥哥的声音传来。 小悦不禁有些疑惑,哥哥有什么事情需要她帮忙

再学Blazor——概述

简介 Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性。 使用 C# 语言创建丰富的交互式 UI 共享前后端应用逻辑 可以生成混合桌面和移动应用 受益于 .NET 的性能、可靠性和安全性 需要有 HTML、CSS、JS 相关基础(开发 UI 框架的话) 组件化设

图形库使用 Direct3d

1 里面的数学 矩阵是三角函数组合出来的 旋转的时候 xy 两个变量距离变 第三轴被影响角度 2视锥 远近四棱锥双剪切平面 3 三维点 A点 B点 C点 确定三位坐标 ,初始坐标是坐标中中心值 x,y,z(0,0,0) 4移动 三维点 点A到点B 使用x加减y加减z加减 5图片 循环扫描整张图片 6

Blazor技术入门

曾写过点儿前后端分离的项目(Vue+.NET Core Web API)、WPF和WinForm。因为Blazor不支持小程序的原因(相对于uniapp),所以只是大概知道Blazor可以写Web、PC和移动端项目,最大的特点就是使用C#代替JS。本文算是通过几个默认例子入门Blazor技术吧。 一