/ / Как да заменим разширените ASCII знаци в C #? - c #, .net, vb.net

Как да заменим разширените ASCII символи в C #? - c #, .net, vb.net

Опитвам се да заместя неподлежащи на печат знаци, т.е. разширени ASCII знаци от огромен низ.

foreach (string line in File.ReadLines(txtfileName.Text))
{
MessageBox.Show( Regex.Replace(line,
@"p{Cc}",
a => string.Format("[{0:X2}]", " ")
)); ;

}

това не изглежда да работи.

EX: AA AAA трябва да се преобразува в AA AA

Отговори:

1 за отговор № 1

Ако приемем, че кодирането трябва да бъде UTF8 Опитайте тази:

string strReplacedVal = Encoding.ASCII.GetString(
Encoding.Convert(
Encoding.UTF8,
Encoding.GetEncoding(
Encoding.ASCII.EncodingName,
new EncoderReplacementFallback(" "),
new DecoderExceptionFallback()
),
Encoding.UTF8.GetBytes(line)
)
);

0 за отговор № 2

Тъй като отваряте файла като utf-8, трябвабъда. Така че нейните кодови единици са един байт и utf-8 има много хубава характеристика на кодиране на герои над ␡ с байтове, които са изключително над 0x7f и символи на или под ␡ с байтове само на или под 0x7f.

За ефективност можете да презаписвате файла на място с няколко KB наведнъж.

Забележете, че някои знаци могат да бъдат заменени от повече от едно място.

// Operates on a utf-8 encoded text file
using (var stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite))
{
const int size = 4096;
var buffer = new byte[size];
int count;
while ((count = stream.Read(buffer, 0, size)) > 0)
{
var changed = false;
for (int i = 0; i < count; i++)
{
// obliterate all bytes that are not encoded characters between ␠ and ␡
if (buffer[i] < " " | buffer[i] > "x7f")
{
buffer[i] = (byte)" ";
changed = true;
}
}
if (changed)
{
stream.Seek(-count, SeekOrigin.Current);
stream.Write(buffer, 0, count);
}
}
}