最新国产好看的视频,伊人天堂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 編碼的字符串。我們可以先考慮一下其中存在的潛在問(wèn)題。

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

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

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

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

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

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

一旦緩沖區(qū)中的最后一個(gè)字符的 UTF-8 編碼不完整,那么 ??Encoding.UTF8.GetString?? 就是轉(zhuǎn)換一個(gè)無(wú)效的 UTF-8 字符串。在這種情況下,該方法返回一個(gè)無(wú)效字符串,因?yàn)樗鼰o(wú)法猜測(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類(lèi)來(lái)正確解碼緩沖區(qū)內(nèi)的字符。在需要性能的情況下,可以使用PipeReader、Rune類(lèi)來(lái)以?xún)?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#快速寫(xiě)本地日志方法

    c#快速寫(xiě)本地日志方法

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

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

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

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

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

    C#拼圖游戲編寫(xiě)代碼

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

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

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

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

    本文介紹使用C#制作屏幕保護(hù)的方法,這個(gè)屏幕保護(hù)就是仿效視窗系統(tǒng)自帶的字幕屏保。下面是用C#如何編寫(xiě)屏幕保護(hù)的整個(gè)過(guò)程
    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)論

云浮市| 枞阳县| 明星| 淳安县| 平塘县| 东至县| 长阳| 南汇区| 大余县| 青州市| 盐城市| 麻城市| 庐江县| 威信县| 武夷山市| 衡阳县| 玉门市| 华宁县| 栖霞市| 酉阳| 连城县| 绥中县| 罗源县| 库伦旗| 柞水县| 家居| 平塘县| 天气| 乌鲁木齐县| 敖汉旗| 大城县| 祁连县| 如皋市| 昭平县| 衡阳县| 西吉县| 都安| 马公市| 三门县| 都昌县| 蓝山县|