58 lines
2.4 KiB
Markdown
58 lines
2.4 KiB
Markdown
# 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 <fisier> | 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).
|
|
|
|
## 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 <fisier>` sau `git cat-file blob <commit>:<cale>`, din Bash, niciodata cu `>` din
|
|
PowerShell 5.1 (adauga BOM si re-encodeaza). Scrie inapoi ca bytes cp1250 explicit, apoi
|
|
`txt2vcx.ps1` + fidelity check.
|
|
|
|
Cazul simplu (s-a pierdut doar 0xBA), inlocuire punctuala pe octet:
|
|
|
|
```bash
|
|
perl -e 'binmode(STDIN);binmode(STDOUT);local $/;$_=<STDIN>;s/\xEF\xBF\xBD/\xBA/g;print' < f > f.tmp
|
|
```
|