繁体   English   中英

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

[英]Storing a string as UTF8 in C#

我在C#中进行了大量的字符串操作,确实需要将字符串每个字符存储一个字节。 这是因为我在内存中同时需要千兆字节的文本,这导致内存不足的问题。 我可以肯定地知道该文本永远不会包含非ASCII字符,因此就我的目的而言,System.String和System.Char将所有内容存储为每个字符两个字节这一事实既没有必要,又是真正的问题。

我将要开始编码自己的CharAscii和StringAscii类-字符串基本上将其数据保存为byte [],并公开类似于System.String的字符串操作方法。 但是,似乎要做很多看起来很标准的问题,这似乎需要做很多工作,因此,我在这里发布的内容确实是为了检查是否存在更简单的解决方案。 例如,是否有某种方法可以使System.String在内部将数据存储为我没有注意到的UTF8,或者以其他方式解决问题?

好的,您可以创建一个包装器,以UTF-8字节的形式检索数据并将所需的数据转换为System.String,然后反之亦然,以将字符串推回内存中。 Encoding类将在这里为您提供帮助:

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

var myReturnedString = utf8.GetString(utfBytes);

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

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

并不是的。 System.String用于存储字符串。 您的需求是具有特定内存优势的非常特殊的字符串子集。

现在,出现了“具有特定内存优势的非常特殊的字符串子集”,但并不总是相同的非常特殊的子集。 仅ASCII的代码不适合人类阅读,因此它往往是短代码,或者可以以流处理的方式处理的东西,或者是文本块与字节合并而完成其他工作(例如,相当多的二进制格式将具有直接转换为ASCII的小比特)。

因此,您有一个非常奇怪的要求。

更何况,当您谈到千兆字节部分时。 如果要处理演出,我会立即考虑如何停止处理演出,和/或获得比仅50%更大的节省。 我会考虑将当前不感兴趣的块映射到文件,或者将绳索映射到其他内容。 当然,这些方法在某些情况下会起作用,而不是在所有情况下都起作用,因此,再一次,我们不是在谈论.NET应该坚持一种“一刀切”的原则,因为一种尺码无法适应所有。

除此之外,仅utf-8位并不难。 所有其他方法都可以使用。 同样,您所需要的将与其他人不一样。

如我所见,您的问题是C#中的char占用了2个字节,而不是一个字节。

读取文本文件的一种方法是使用:

    System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Open);
    System.IO.BinaryReader br = new System.IO.BinaryReader(fs);

    byte[] buffer = new byte[1024];
    int read = br.Read(buffer, 0, (int)fs.Length);

    br.Close();
    fs.Close(); 

这样,您就可以从文件中读取字节。 我尝试使用UTF-8编码的* .txt文件( 每个字符2个字节)ANSI每个字符1个字节)进行编码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM