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

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

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

?我們下面的代碼是從一個(gè)流 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();
}

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

例如,笑臉符號(hào)?? 有時(shí)會(huì)被解碼為 4 個(gè)未知字符:

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

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

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

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

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

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

var sb = new StringBuilder();
// 模擬逐個(gè)字節(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 }

如何修復(fù)代碼

有多種方法可以修復(fù)代碼。

第一種方法:只有當(dāng)你得到全部數(shù)據(jù)時(shí),才將字節(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());
}

第二種方法:可以把流包進(jìn)一個(gè)具有正確編碼的 StreamReader 對(duì)象中。

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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c#快速寫本地日志方法

    c#快速寫本地日志方法

    下面小編就為大家分享一篇c#快速寫本地日志方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • C#?使用Aspose.Cells?導(dǎo)出Excel的步驟及問題記錄

    C#?使用Aspose.Cells?導(dǎo)出Excel的步驟及問題記錄

    Aspose.Cells是一款功能強(qiáng)大的Excel文檔處理和轉(zhuǎn)換控件,開發(fā)人員和客戶電腦無需安裝Microsoft Excel也能在應(yīng)用程序中實(shí)現(xiàn)類似Excel的強(qiáng)大數(shù)據(jù)管理功能,對(duì)C#?使用Aspose.Cells?導(dǎo)出Excel的步驟及問題記錄感興趣的朋友一起看看吧
    2022-01-01
  • C#多線程系列之線程的創(chuàng)建和生命周期

    C#多線程系列之線程的創(chuàng)建和生命周期

    這篇文章介紹了C#多線程系列之線程的創(chuàng)建和生命周期,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C#拼圖游戲編寫代碼

    C#拼圖游戲編寫代碼

    這篇文章主要為大家詳細(xì)介紹了C#拼圖游戲的編寫代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C#通過NPOI操作Excel的實(shí)例代碼

    C#通過NPOI操作Excel的實(shí)例代碼

    C#操作Excel的方法有很多種,本文介紹了C#通過NPOI操作Excel,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • c#制作屏幕保護(hù)程序步驟(字幕屏保)

    c#制作屏幕保護(hù)程序步驟(字幕屏保)

    本文介紹使用C#制作屏幕保護(hù)的方法,這個(gè)屏幕保護(hù)就是仿效視窗系統(tǒng)自帶的字幕屏保。下面是用C#如何編寫屏幕保護(hù)的整個(gè)過程
    2014-01-01
  • C#操作字符串方法總結(jié)實(shí)例代碼

    C#操作字符串方法總結(jié)實(shí)例代碼

    這篇文章主要介紹了C#操作字符串方法總結(jié)實(shí)例代碼,需要的朋友可以參考下
    2017-10-10
  • 詳解 C# 中XML對(duì)象的序列化和反序列化

    詳解 C# 中XML對(duì)象的序列化和反序列化

    這篇文章主要介紹了詳解 C# 中XML對(duì)象的序列化和反序列化,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#方法的總結(jié)詳解

    C#方法的總結(jié)詳解

    本篇文章是對(duì)C#方法進(jìn)行了詳細(xì)的總結(jié)與介紹,需要的朋友參考下
    2013-05-05
  • 基于C#實(shí)現(xiàn)微信支付寶掃碼支付功能

    基于C#實(shí)現(xiàn)微信支付寶掃碼支付功能

    為公司系統(tǒng)業(yè)務(wù)需要,這幾天了解了一下微信和支付寶掃碼支付的接口,并用c#實(shí)現(xiàn)了微信和支付寶掃碼支付的功能。需要的朋友跟隨小編一起看看吧
    2019-06-06

最新評(píng)論

昆明市| 南城县| 新巴尔虎右旗| 南通市| 荔浦县| 晋城| 三门县| 林芝县| 巴里| 阳高县| 万年县| 晋江市| 历史| 黄浦区| 壤塘县| 沅江市| 平湖市| 怀柔区| 南充市| 铜川市| 鄂州市| 兴业县| 昂仁县| 三江| 阳曲县| 民勤县| 望江县| 珲春市| 洛阳市| 黄龙县| 维西| 镇原县| 神农架林区| 张北县| 方山县| 那曲县| 达拉特旗| 洛南县| 桃园市| 壶关县| 比如县|