最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#移除字符串中的不可見(jiàn)Unicode字符 案例代碼

 更新時(shí)間:2023年02月02日 14:11:12   作者:程序設(shè)計(jì)實(shí)驗(yàn)室  
最近發(fā)現(xiàn)某個(gè)數(shù)據(jù)采集的系統(tǒng)拿下來(lái)的數(shù)據(jù),有些字段的JSON被莫名截?cái)嗔?,?dǎo)致后續(xù)數(shù)據(jù)分析的時(shí)候解析JSON失敗,這篇文章主要介紹了C#移除字符串中的不可見(jiàn)Unicode字符 ,需要的朋友可以參考下

C#移除字符串中的不可見(jiàn)Unicode字符 

背景

最近發(fā)現(xiàn)某個(gè)數(shù)據(jù)采集的系統(tǒng)拿下來(lái)的數(shù)據(jù),有些字段的JSON被莫名截?cái)嗔耍瑢?dǎo)致后續(xù)數(shù)據(jù)分析的時(shí)候解析JSON失敗。

類(lèi)似這樣

{"title": "你好

或者這樣,多了個(gè)雙引號(hào)啥的

{"title":""你好"}

因?yàn)閿?shù)據(jù)庫(kù)是Oracle,起初以為是Oracle這老古董出問(wèn)題了,結(jié)果一番折騰,把每條寫(xiě)入數(shù)據(jù)的SQL語(yǔ)句都拿出來(lái),看起來(lái)里面的JSON格式都沒(méi)問(wèn)題。

這也太詭異了吧,看起來(lái)沒(méi)毛病,但就為啥JSON被隨機(jī)截?cái)嗄兀?/p>

最后我試著把整段SQL放在Rider的 query console 里面執(zhí)行,然后再去數(shù)據(jù)庫(kù)里讀取這段JSON,居然發(fā)現(xiàn)變成這樣了:

{"title":"?你好"}

啊這,看到這個(gè)大大的問(wèn)號(hào),立刻就能知道這個(gè)“你好”里面不止是這兩個(gè)字,肯定含有不可見(jiàn)的Unicode字符。

然后把這段JSON復(fù)制出來(lái),用16進(jìn)制模式打開(kāi),果然看到在“你好”前面有一個(gè) \u0020 的字符…

Unicode碼表

  • 0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic Latin)
  • 0080-00FF:C1控制符及拉丁文補(bǔ)充-1 (C1 Control and Latin 1 Supplement)
  • 0100-017F:拉丁文擴(kuò)展-A (Latin Extended-A)
  • 0180-024F:拉丁文擴(kuò)展-B (Latin Extended-B)
  • 0250-02AF:國(guó)際音標(biāo)擴(kuò)展 (IPA Extensions)
  • 02B0-02FF:空白修飾字母 (Spacing Modifiers)
  • ……

這里再附上部分 Unicode 表格

U+0123456789ABCDEF
0000NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSI
0010DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS
0020!"#$%&'()*+,-./
00300123456789:;<=>?
0040@ABCDEFGHIJKLMNO
0050PQRSTUVWXYZ[\]^_
0060`abcdefg

可以看到上面那個(gè) \u0020 在第三行第一列,是一個(gè)不可見(jiàn)字符,躲在標(biāo)題的前面

也就是因?yàn)檫@個(gè) Unicode 字符,Oracle無(wú)法正確解析,所以導(dǎo)致了插入數(shù)據(jù)的時(shí)候錯(cuò)亂了

所以破案了,就是系統(tǒng)前臺(tái)使用人員,在輸入的時(shí)候不知道咋滴搞了個(gè)Unicode字符進(jìn)去…

解決方法就是我這邊采集的時(shí)候再做一次過(guò)濾…

沒(méi)想到C#要搞個(gè)過(guò)濾 Unicode 還挺折騰的,資料太少…

最后還是參考了Java的資料搞的。= =...

代碼

代碼如下

寫(xiě)了個(gè)擴(kuò)展方法來(lái)過(guò)濾

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

要使用的時(shí)候就這樣

var outStr = "帶有Unicode的字符串".RemoveControlChars();

搞定。

參考資料

UniCode編碼表及部分不可見(jiàn)字符過(guò)濾方案 - https://www.cnblogs.com/fan-yuan/p/8176886.html

https://stackoverflow.com/questions/6198986/how-can-i-replace-non-printable-unicode-characters-in-java 

補(bǔ)充:C# 字符串與unicode互相轉(zhuǎn)換實(shí)戰(zhàn)案例

代碼如下所示:

/// <summary>
  /// 字符串轉(zhuǎn)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> 
  /// 字符串轉(zhuǎn)為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字符串轉(zhuǎn)為正常字符串 
  /// </summary> 
  /// <param name="srcText"></param> 
  /// <returns></returns> 
  public static string UnicodeToString(string srcText)
  {
   string dst = "";
   string src = srcText;
   int len = srcText.Length / 6;
   for (int i = 0; i <= len - 1; i++)
   {
    string str = "";
    str = src.Substring(0, 6).Substring(2);
    src = 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;
  }

到此這篇關(guān)于C#移除字符串中的不可見(jiàn)Unicode字符 的文章就介紹到這了,更多相關(guān)C#移除Unicode字符 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼

    C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼

    這篇文章主要介紹了C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼,有需要的朋友可以參考一下
    2013-12-12
  • C#自定義的字符串操作增強(qiáng)類(lèi)實(shí)例

    C#自定義的字符串操作增強(qiáng)類(lèi)實(shí)例

    這篇文章主要介紹了C#自定義的字符串操作增強(qiáng)類(lèi),涉及C#操作字符串實(shí)現(xiàn)分割、轉(zhuǎn)換、去重等常用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 基于WPF實(shí)現(xiàn)驗(yàn)證碼控件

    基于WPF實(shí)現(xiàn)驗(yàn)證碼控件

    這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)一個(gè)簡(jiǎn)單的驗(yàn)證碼控件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-08-08
  • Unity實(shí)現(xiàn)枚舉類(lèi)型中文顯示

    Unity實(shí)現(xiàn)枚舉類(lèi)型中文顯示

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)枚舉類(lèi)型中文顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 簡(jiǎn)單記錄C# 條件編譯

    簡(jiǎn)單記錄C# 條件編譯

    條件編譯是C#比Java多出的東西,但我跟前輩請(qǐng)教后,他們都說(shuō)條件編譯在實(shí)際的項(xiàng)目開(kāi)發(fā)中不怎么使用.下面僅僅是將步奏記錄下來(lái),有需要的小伙伴可以參考下。
    2015-06-06
  • Unity實(shí)現(xiàn)截屏以及根據(jù)相機(jī)畫(huà)面截圖

    Unity實(shí)現(xiàn)截屏以及根據(jù)相機(jī)畫(huà)面截圖

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)截屏以及根據(jù)相機(jī)畫(huà)面截圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 基于WPF實(shí)現(xiàn)步驟控件的示例代碼

    基于WPF實(shí)現(xiàn)步驟控件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)簡(jiǎn)單的步驟控件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-01-01
  • C#實(shí)現(xiàn)自定義打印文字和圖片的示例代碼

    C#實(shí)現(xiàn)自定義打印文字和圖片的示例代碼

    本文主要介紹了C#實(shí)現(xiàn)自定義打印文字和圖片的示例代碼,C#中打印其實(shí)就是自己繪圖+調(diào)用系統(tǒng)打印函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C#探秘系列(一)——ToDictionary,ToLookup

    C#探秘系列(一)——ToDictionary,ToLookup

    這個(gè)系列我們看看C#中有哪些我們知道,但是又不知道怎么用,又或者懶得去了解的東西,比如這篇我們要介紹的toDictionary和ToLookup。
    2014-05-05
  • unity 文件流讀取圖片與www讀取圖片的區(qū)別介紹

    unity 文件流讀取圖片與www讀取圖片的區(qū)別介紹

    這篇文章主要介紹了unity 文件流讀取圖片與www讀取圖片的對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04

最新評(píng)論

观塘区| 城步| 子洲县| 剑川县| 颍上县| 五寨县| 鞍山市| 黑龙江省| 宁阳县| 三门峡市| 酉阳| 琼中| 普宁市| 维西| 江北区| 高安市| 偃师市| 和田县| 永胜县| 孝义市| 夹江县| 拜泉县| 平乐县| 永靖县| 沈丘县| 招远市| 保山市| SHOW| 大城县| 土默特左旗| 云阳县| 定襄县| 霍林郭勒市| 安泽县| 抚顺县| 凭祥市| 南涧| 灵丘县| 遂川县| 扶余县| 昂仁县|