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 № 1Supponendo 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);
}
}
}