# Capcana: corupere diacritice la editarea .sc2/.vc2 Comun tuturor proiectelor ROA* - tine de formatul .sc2/.vc2 (FoxBin2Prg), nu de un proiect anume. ## Faptul Fisierele .sc2/.vc2 sunt cp1250 (Europa Centrala), nu UTF-8, desi antetul FoxBin2Prg declara CPID="1252" - eticheta din antet nu e adevarul despre encoding. Controalele cu text diacritic au FontCharSet = 238. ## Tabelul de octeti (cp1250 real -> aparenta daca decodezi gresit ca cp1252) | Litera | Byte | Aparenta cp1252 gresita | |---|---|---| | a cu caciula minuscul | 0xE3 | a-tilde | | A cu caciula majuscul | 0xC3 | A-tilde | | i cu caciula minuscul | 0xEE | identic (zona comuna cp1250/cp1252) | | I cu caciula majuscul | 0xCE | identic (zona comuna cp1250/cp1252) | | a circumflex | 0xE2 | identic (zona comuna cp1250/cp1252) | | t cu virgula minuscul | 0xFE | thorn minuscul | | S cu virgula majuscul | 0xAA | ordinal masculin | | s cu virgula minuscul | 0xBA | ordinal feminin | Nu "corecta" un s-cu-virgula crezand ca e typo - e litera corecta in cp1250. ## Regula operationala Orice scriere cu un tool care nu pastreaza octetii nativ (Edit/Write) corupe TOATE caracterele >= 0x80 din TOT fisierul (0xBA -> EF BF BD), chiar la o singura linie schimbata, si se repeta la FIECARE scriere. Nu re-encoda niciodata fisierul intreg: lucreaza pe octeti ([IO.File]::ReadAllBytes/WriteAllBytes cu GetEncoding(1250)) sau scrie strict ASCII in continutul nou. Editeaza tot ce ai de editat, verifica, repara o singura data DUPA ultima scriere. ## Verificare (cens de octeti) ```bash od -An -tx1 | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c ``` La stricare censul CRESTE (un octet devine trei) - nu urmari doar scaderile. Cauta explicit secventa `EF BF BD`, nu tiparul generic `C3`/`C4`/`C5`/`C8` (acela apare si in UTF-8 legitim din cod). Decodat cp1250, `EF BF BD` apare ca "�" in caption. Varianta veche, utila cand cauti pozitia exacta (linia) a unui octet suspect: ```bash perl -ne 'print "$.\n" if /[\x80-\xFF]/' ``` ## Reparare `EF BF BD` nu spune ce caracter s-a pierdut (toate diacriticele devin la fel) - inlocuirea oarba cu 0xBA strica alte litere din alte pozitii. Ia octetul corect per pozitie din `svn cat ` sau `git cat-file blob :`, din Bash, niciodata cu `>` din PowerShell 5.1 (adauga BOM si re-encodeaza). Scrie inapoi ca bytes cp1250 explicit, apoi `txt2vcx.ps1` + fidelity check. Coruperea se repeta la FIECARE scriere, nu doar la prima: editeaza tot ce ai de editat, verifica byte-level, si repara o singura data DUPA ultima scriere - nu intre editari. Cazul simplu (s-a pierdut doar un octet, cel original cunoscut, ex. 0xBA pentru s-cu-virgula), inlocuire punctuala pe secventa corupta - acelasi risc de coliziune poate afecta si alte fisiere cu acelasi octet, nu doar pozitia curenta: ```bash perl -e 'binmode(STDIN);binmode(STDOUT);local $/;$_=;s/\xEF\xBF\xBD/\xBA/g;print' < f > f.tmp ```