千家信息网

C#从UTF-8流中读取字符串的正确方法是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"C#从UTF-8流中读取字符串的正确方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学
千家信息网最后更新 2026年11月01日C#从UTF-8流中读取字符串的正确方法是什么

本篇内容介绍了"C#从UTF-8流中读取字符串的正确方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

我们下面的代码是从一个流 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 个字节来表示一个 Unicode 字符,有关字符串编码的知识可以参考 字符编码 一文。

Stream.Read 方法可以把从 1 到 messageBuffer.Length 字节返回,这意味着缓冲区可能包含不完整的 UTF-8 字符。

一旦缓冲区中的最后一个字符的 UTF-8 编码不完整,那么 Encoding.UTF8.GetString 就是转换一个无效的 UTF-8 字符串。在这种情况下,该方法返回一个无效字符串,因为它无法猜测丢失的字节。

我们使用以下代码演示以上行为:

var bytes = Encoding.UTF8.GetBytes("?");// bytes = new byte[4] { 240, 159, 152, 138 }var sb = new StringBuilder();// 模拟逐个字节地读取数据流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 }

如何修复代码

有多种方法可以修复代码。

第一种方法:只有当你得到全部数据时,才将字节数组转换为字符串。

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类来正确解码缓冲区内的字符。在需要性能的情况下,可以使用PipeReader、Rune类来以内存优化的方式读取数据。

"C#从UTF-8流中读取字符串的正确方法是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

字符 字符串 方法 UTF-8 编码 字节 代码 情况 数据 知识 缓冲区 缓冲 C# 内容 更多 问题 有关 不同 原始 实用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 湖北九亚互联网络科技有限公司 互联网科技工作委员会副主任毛军 与互联网科技公司 互联网公司 科技公司 礼当家互联网科技 互联网女皇 腾讯科技 互联网科技产品 济南华为互联网科技产业总部基地 互联网时代科技改变生活 重庆互联网医院沙龙医盟信息科技 语蝶互联网科技有限公司 互联网科技扶贫时间 想开互联网科技公司怎么样 乌鲁木齐新华智原互联网科技学校 东莞新华互联网科技学校 阿里互联网科技企业 互联网科技接地气 上海万顺科技互联网有限公司招聘 互联网领先科技成果宣传视频 广州大一互联网络科技有限公司 金融科技 互联网金融 期待互联网科技 互联网科技教育视频 世界互联网科技公司市值排名 世界互联网领先科技成果获奖 杭州融税互联网科技有限公司 现代互联网科技公司 保山浩联互联网科技有限公司 互联网科技创新方面的资料
0