/ / Come sostituire i caratteri ASCII estesi in C #? - c #, .net, vb.net

Come sostituire i caratteri ASCII estesi in C #? - c #, .net, vb.net

Sto cercando di sostituire i caratteri non stampabili, ovvero i caratteri ASCII estesi da una stringa ENORME.

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

}

questo non sembra funzionare.

EX: AAÂAA dovrebbe essere convertito in AA AA

risposte:

1 per risposta № 1

Supponendo che la codifica sia UTF8 prova questo:

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

0 per risposta № 2

Dato che stai aprendo il file come utf-8, è necessarioessere. Quindi, le sue unità di codice sono un byte e utf-8 ha la caratteristica molto bella di codificare caratteri sopra ␡ con byte esclusivamente sopra 0x7f e caratteri pari o inferiori a ␡ con byte esclusivamente pari o inferiori a 0x7f.

Per motivi di efficienza, è possibile riscrivere il file in posizione alcuni KB alla volta.

Nota: alcuni personaggi potrebbero essere sostituiti da più di uno spazio, però.

// 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);
}
}
}