簡體   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