我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#移除字符串中的不可见Unicode字符案例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#移除字符串中的不可见Unicode字符案例代码

C#移除字符串中的不可见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+0123456789ABCDEF
0000NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSI
0010DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS
0020!"#$%&'()*+,-./
00300123456789:;<=>?
0040@ABCDEFGHIJKLMNO
0050PQRSTUVWXYZ[\]^_
0060`abcdefg

可以看到上面那个 \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();

搞定。

参考资料

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 

补充:C# 字符串与unicode互相转换实战案例

代码如下所示:

/// <summary>
  /// 字符串转Unicode
  /// </summary>
  /// <param name="source">源字符串</param>
  /// <returns>Unicode编码后的字符串</returns>
  public static string String2Unicode(string source)
  {
   var bytes = Encoding.Unicode.GetBytes(source);
   var stringBuilder = new StringBuilder();
   for (var i = 0; i < bytes.Length; i += 2)
   {  
    stringBuilder.AppendFormat("\\u{0:x2}{1:x2}", bytes[i + 1], bytes[i]);
   }
   return stringBuilder.ToString();
  }
  /// <summary> 
  /// 字符串转为UniCode码字符串 
  /// </summary> 
  /// <param name="s"></param> 
  /// <returns></returns> 
  public static string StringToUnicode(string s)
  {
   char[] charbuffers = s.ToCharArray();
   byte[] buffer;
   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < charbuffers.Length; i++)
   {
    buffer = System.Text.Encoding.Unicode.GetBytes(charbuffers[i].ToString());
    sb.Append(String.Format("\\u{0:X2}{1:X2}", buffer[1], buffer[0]));
   }
   return sb.ToString();
  }
  /// <summary> 
  /// Unicode字符串转为正常字符串 
  /// </summary> 
  /// <param name="class="lazy" data-srcText"></param> 
  /// <returns></returns> 
  public static string UnicodeToString(string class="lazy" data-srcText)
  {
   string dst = "";
   string class="lazy" data-src = class="lazy" data-srcText;
   int len = class="lazy" data-srcText.Length / 6;
   for (int i = 0; i <= len - 1; i++)
   {
    string str = "";
    str = class="lazy" data-src.Substring(0, 6).Substring(2);
    class="lazy" data-src = class="lazy" data-src.Substring(6);
    byte[] bytes = new byte[2];
    bytes[1] = byte.Parse(int.Parse(str.Substring(0, 2), System.Globalization.NumberStyles.HexNumber).ToString());
    bytes[0] = byte.Parse(int.Parse(str.Substring(2, 2), System.Globalization.NumberStyles.HexNumber).ToString());
    dst += Encoding.Unicode.GetString(bytes);
   }
   return dst;
  }

到此这篇关于C#移除字符串中的不可见Unicode字符 的文章就介绍到这了,更多相关C#移除Unicode字符 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#移除字符串中的不可见Unicode字符案例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#移除字符串中的不可见Unicode字符案例代码

最近发现某个数据采集的系统拿下来的数据,有些字段的JSON被莫名截断了,导致后续数据分析的时候解析JSON失败,这篇文章主要介绍了C#移除字符串中的不可见Unicode字符,需要的朋友可以参考下
2023-02-02

Python删除字符串中字符的四种方法示例代码

这篇文章主要介绍了Python删除字符串中字符的四种方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-12-08

字符串中找出连续最长的数字字符串的实例代码

这篇文章介绍了字符串中找出连续最长的数字字符串的实例代码,有需要的朋友可以参考一下
2022-11-15

C语言删除输入字符串中的空格示例代码

最近工作中遇到了需求,要删除字符串中的所有空格,就要筛选出空格字符,这篇文章主要给大家介绍了关于利用C语言删除输入字符串中的空格的相关资料,需要的朋友可以参考下
2022-12-08

C++中常见的字符串拼接问题解决方案

C++中常见的字符串拼接问题解决方案在C++编程中,字符串拼接是一种常见的操作,特别是在处理文本和输出结果时。本文将介绍一些常见的字符串拼接问题,并提供相应的解决方案,同时附上代码示例以帮助读者理解。使用"+"运算符进行字符串拼接在C++中
2023-10-22

python中数字列表转化为数字字符串的实例代码

先前学习过,数字和字符串都可以存储到变量当中,下面这篇文章主要给大家介绍了关于python中数字列表转化为数字字符串的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-02-15

C++中常见的字符串拼接问题的解决方案

C++中常见的字符串拼接问题的解决方案在C++编程中,字符串拼接是一个常见的操作,通常用于拼接两个或多个字符串,或者将其他数据类型转换为字符串后进行拼接。在处理字符串拼接的过程中,我们需要考虑到性能和代码的简洁性。本文将介绍几种常见的字符串
2023-10-22

Oracle中分割字符串的方法实例代码

目录1. 使用 regexp_substr() 函数1.1 方式11.2 方式21.3 注意问题(尤其是存储过程中用到,可能会入坑)2. 自定义函数2.1 自定义类型 table2.2 自定义函数2.2.1 自定义函数2.2.2 效果如下:
2023-02-15

C++中常见的字符串处理问题及解决方案

C++中常见的字符串处理问题及解决方案引言字符串处理是在C++编程中经常遇到的问题之一。无论是从用户的输入,还是从文件中读取数据,或者是进行数据的处理和转换,字符串处理始终占据着重要的位置。本文将介绍在C++中常见的字符串处理问题,并给出相
2023-10-22

C语言实现字符串替换的示例代码怎么写

本篇文章给大家分享的是有关C语言实现字符串替换的示例代码怎么写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 替换,意思就是用另一个字符串str3来替换str1中所有的str2
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录