我在C#中进行了很多字符串操作,并且确实需要将字符串存储为每个字符一个字节。这是因为我在内存中同时需要千兆字节的文本,这会导致内存问题。我肯定知道这个文本永远不会包含非ASCII字符,所以对于我的目的,System.String和System.Char将每个字符存储为两个字节的事实既不是必需的,也是一个真正的问题。
我即将开始编写自己的CharAscii和StringAscii类 - 字符串1基本上将其数据保存为byte [],并公开类似于System.String所做的字符串操作方法。然而,这似乎做了很多工作似乎是一个非常标准的问题,所以我真的在这里发帖,检查是否还没有更简单的解决方案。有没有例如我可以通过某种方式使System.String在内部将数据存储为我没有注意到的UTF8,或者以其他方式解决问题?
答案 0 :(得分:11)
好吧,您可以创建一个包装器,将数据检索为UTF-8字节,并根据需要将片段转换为System.String,反之亦然,将字符串推回内存。编码类将帮助您:
var utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(myString);
var myReturnedString = utf8.GetString(utfBytes);
答案 1 :(得分:6)
正如您所发现的,CLR使用UTF-16进行字符编码。你最好的选择可能是使用Encoding classes&一个BitConverter来处理文本。这个问题在两种编码之间进行转换有一些很好的例子:
答案 2 :(得分:2)
不是真的。 System.String
用于存储字符串。您的要求是针对具有特定内存优势的特定字符串子集。
现在,“具有特定内存优势的非常特殊的字符串子集”出现了很多,但并不总是相同的非常特定的子集。仅限ASCII的代码不是为了人类阅读,因此它往往是短代码,或者可以以流处理方式处理的东西,或者是与执行其他工作的字节合并的文本块(例如,相当多的二进制格式将具有直接转换为ASCII的小位。
因此,你有一个非常奇怪的要求。
当你来到千兆字节部分时更是如此。如果我正在处理演出,我会立即想到如何停止演出,和/或获得比50%更严重的节省。我正在考虑将我目前不感兴趣的块映射到文件,或者关于绳索,或者关于其他一些东西。当然,这些都适用于某些情况,而不适用于所有情况,所以我们不再谈论.NET应该坚持某种东西的东西,因为一个尺寸不适合所有
除此之外,只需要utf-8位就不那么难了。这是所有其他方法成为工作。同样,你需要的东西与其他人不一样。
答案 3 :(得分:1)
我可以看到你的问题是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个字节每个字符。