Опитвам се да заместя неподлежащи на печат знаци, т.е. разширени 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);
}
}
}