欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#?從?UTF-8?流中讀取字符串的正確方法及代碼詳解

 更新時間:2021年11月22日 08:28:24   作者:wanghao72214  
在本篇文章里小編給大家整理的是一篇關(guān)于C#?從?UTF-8?流中讀取字符串的正確方法的知識點內(nèi)容,有興趣的朋友們可以學習參考下。

?我們下面的代碼是從一個流 stream 中讀取 UTF-8 編碼的字符串。我們可以先考慮一下其中存在的潛在問題。

string ReadString(Stream stream)
{
    var sb = new StringBuilder();
    var buffer = new byte[4096];
    int readCount;
    while ((readCount = stream.Read(buffer)) > 0)
    {
        var s = Encoding.UTF8.GetString(buffer, 0, readCount);
        sb.Append(s);
    }

    return sb.ToString();
}

問題出在:某些情況下返回的字符串與與原始編碼的字符串并不同。

例如,笑臉符號?? 有時會被解碼為 4 個未知字符:

編碼字符串: ??
解碼字符串: ????

我們知道:UTF-8 可以使用 1 到 4 個字節(jié)來表示一個 Unicode 字符,有關(guān)字符串編碼的知識可以參考 ??字符編碼??? 一文。

??Stream.Read??? 方法可以把從 1 到?? messageBuffer.Length??? 字節(jié)返回,這意味著緩沖區(qū)可能包含不完整的 UTF-8 字符。

一旦緩沖區(qū)中的最后一個字符的 UTF-8 編碼不完整,那么 ??Encoding.UTF8.GetString?? 就是轉(zhuǎn)換一個無效的 UTF-8 字符串。在這種情況下,該方法返回一個無效字符串,因為它無法猜測丟失的字節(jié)。

我們使用以下代碼演示以上行為:

var bytes = Encoding.UTF8.GetBytes("?");
// bytes = new byte[4] { 240, 159, 152, 138 }

var sb = new StringBuilder();
// 模擬逐個字節(jié)地讀取數(shù)據(jù)流
for (var i = 0; i < bytes.Length; i++)
{
    sb.Append(Encoding.UTF8.GetString(bytes, i, 1));
}

Console.WriteLine(sb.ToString());
// "????" 代替了 "??"

Encoding.UTF8.GetBytes(sb.ToString());
// new byte[12] { 239, 191, 189, 239, 191, 189, 239, 191, 189, 239, 191, 189 }

如何修復代碼

有多種方法可以修復代碼。

第一種方法:只有當你得到全部數(shù)據(jù)時,才將字節(jié)數(shù)組轉(zhuǎn)換為字符串。

string ReadString(Stream stream)
{
    using var ms = new MemoryStream();
    var buffer = new byte[4096];
    int readCount;
    while ((readCount = stream.Read(buffer)) > 0)
    {
        ms.Write(buffer, 0, readCount);
    }

    return Encoding.UTF8.GetString(ms.ToArray());
}

第二種方法:可以把流包進一個具有正確編碼的 StreamReader 對象中。

string ReadString(Stream stream)
{
    using var sr = new StreamReader(stream, Encoding.UTF8);
    return sr.ReadToEnd();
}

另外,還可以使用System.Text.Decoder類來正確解碼緩沖區(qū)內(nèi)的字符。在需要性能的情況下,可以使用PipeReader、Rune類來以內(nèi)存優(yōu)化的方式讀取數(shù)據(jù)。

到此這篇關(guān)于C#?從?UTF-8?流中讀取字符串的正確方法及代碼詳解的文章就介紹到這了,更多相關(guān)C#?從?UTF-8?流中讀取字符串的正確方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析C#中StringBuilder類的高效及與String的對比

    淺析C#中StringBuilder類的高效及與String的對比

    StringBuilder類所創(chuàng)造出來的字符串對象在拼接操作等方面比普通的string類往往要高效很多,這是它們在內(nèi)存劃分方式上的不同所決定的,下面就來淺析C#中StringBuilder類的高效及與String的對比
    2016-05-05
  • 使用C#連接并讀取MongoDB數(shù)據(jù)庫

    使用C#連接并讀取MongoDB數(shù)據(jù)庫

    這篇文章介紹了使用C#連接并讀取MongoDB數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C#簡單實現(xiàn)發(fā)送socket字符串

    C#簡單實現(xiàn)發(fā)送socket字符串

    這篇文章主要為大家詳細介紹了C#簡單實現(xiàn)socket字符串發(fā)送,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C# 控件屬性和InitializeComponent()關(guān)系案例詳解

    C# 控件屬性和InitializeComponent()關(guān)系案例詳解

    這篇文章主要介紹了C# 控件屬性和InitializeComponent()關(guān)系案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C# 在PDF文檔中創(chuàng)建表格的實現(xiàn)方法

    C# 在PDF文檔中創(chuàng)建表格的實現(xiàn)方法

    表格能夠一目了然的讓用戶看到數(shù)據(jù)信息,使信息顯得有條理化,那么在pdf類型的文檔中如何來添加表格并對表格進行格式化操作呢?下面小編給大家?guī)砹薈# 在PDF文檔中創(chuàng)建表格的實現(xiàn)方法,需要的朋友參考下吧
    2017-12-12
  • c# winform多線程死循環(huán)踩坑

    c# winform多線程死循環(huán)踩坑

    本文主要介紹了c# winform多線程死循環(huán)踩坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • C#實現(xiàn)窗體全屏的兩種方法

    C#實現(xiàn)窗體全屏的兩種方法

    這篇文章主要為大家詳細介紹了C#實現(xiàn)窗體全屏的兩種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • c#使用UTF-8編碼實現(xiàn)處理多語言文本

    c#使用UTF-8編碼實現(xiàn)處理多語言文本

    UTF-8編碼是現(xiàn)代應(yīng)用中處理多語言文本的首選,所以本文為大家詳細介紹了C#如何使用UTF-8編碼實現(xiàn)處理多語言文本,感興趣的小伙伴可以了解下
    2024-01-01
  • C#中調(diào)用Windows API的技術(shù)要點說明

    C#中調(diào)用Windows API的技術(shù)要點說明

    本篇文章主要是對C#中調(diào)用Windows API的技術(shù)要點進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#使用Thrift作為RPC框架入門詳細教程

    C#使用Thrift作為RPC框架入門詳細教程

    這篇文件我們講了從0到1使用thrift框架的方法,也講了一些該框架的基本知識,本文將詳細介紹 Thrift 在C#語言下的使用方式,并且提供豐富的實例代碼加以解釋說明,幫助使用者快速構(gòu)建服務(wù),感興趣的朋友一起看看吧
    2021-11-11

最新評論