在C#中将字符串存储为UTF8

Pha*_*mer 35 .net c# string ascii utf-8

我在C#中进行了大量的字符串操作,并且确实需要将字符串存储为每个字符一个字节.这是因为我在内存中同时需要千兆字节的文本,这会导致内存问题.我确信这个文本永远不会包含非ASCII字符,所以对于我的目的,System.String和System.Char将每个字符存储为两个字节的事实既不必要又是一个真正的问题.

我即将开始编写自己的CharAscii和StringAscii类 - 字符串1基本上将其数据保存为byte [],并公开类似于System.String所做的字符串操作方法.然而,这似乎做了很多工作似乎是一个非常标准的问题,所以我真的在这里发帖,检查是否还没有更简单的解决方案.有没有例如我可以使System.String内部存储数据为UTF8,我没有注意到,或者其他方式解决问题?

Kei*_*thS 11

好吧,您可以创建一个包装器,将数据检索为UTF-8字节,并根据需要将片段转换为System.String,反之亦然,将字符串推回内存.Encoding类将帮助您:

var utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(myString);

var myReturnedString = utf8.GetString(utfBytes);
Run Code Online (Sandbox Code Playgroud)

  • @Tigran - 是的.除非OP希望完全放弃使用.NET Framework免费获得的所有字符串(我强烈建议不要使用),否则至少他正在使用的一些数据必须转换为UTF- 16 System.String使用它.但是,他整体使用的无数数据可以保留为UTF-8(如果他确实确定数据不包含任何非ASCII字符,则甚至是ASCII). (3认同)

Chr*_*ris 6

正如您所发现的,CLR使用UTF-16进行字符编码.您最好的选择可能是使用Encoding类和BitConverter来处理文本.这个问题在两种编码之间进行转换有一些很好的例子:

在C#中将字符串(UTF-16)转换为UTF-8