UTF-8 编码的适用范围越来越广了,特别在 Web 编程中使用的非常多,因为 HTTP 协议默认的编码就是 UTF-8,现在大多数网站的编码也都变为 UTF-8 了 。
但 C# 中的字符串是 UTF-16 编码的。在 C# 11 之前,程序员要么将 UTF-8 转换为十六进制,导致代码冗长、不可读,而且容易出错;要么在运行时对字符串文本进行编码,牺牲程序性能。
// 高效,但不直观,容易出错
static ReadOnlySpan AuthWithTrailingSpace => new byte[] { 0x41, 0x55, 0x54, 0x48, 0x20 };
WriteBytes(AuthWithTrailingSpace);
// 编译时分配,但还是不够简洁
static readonly byte[] s_authWithTrailingSpace = Encoding.UTF8.GetBytes("AUTH ");
WriteBytes(s_authWithTrailingSpace);
// 最简单,但性能很差
WriteBytes(Encoding.UTF8.GetBytes("AUTH ")); 对此,C# 11 打算引入 UTF-8 字符串字面量解决此问题。
ReadOnlySpan span = "hello"u8; 以后,我们不再需要手动分配一个 byte[] 然后在里面一个一个硬编码我们需要的字符。
注意,span 是 ReadOnlySpan
ReadOnlySpan span = new ReadOnlySpan(new byte[] { 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00 }).
Slice(0,5); 所以说,这显然还不是一个彻底的解决方案。 dotnet 工作组也在讨论是否引入一个全新的 Utf8String 类型,但目前尚未确定。
| 留言与评论(共有 0 条评论) “” |