Add DRM KMS documentation PDF to the distribution
This commit is contained in:
@@ -306,3 +306,77 @@ Con chunks de ≤ 600 líneas, el contenido cabe en un string JSON sin romper el
|
|||||||
|
|
||||||
> **Nunca escribir más de 600 líneas de una sola vez con `write`.** Si el contenido total es mayor,
|
> **Nunca escribir más de 600 líneas de una sola vez con `write`.** Si el contenido total es mayor,
|
||||||
> usar `write` para la primera parte y `edit` sucesivo para el resto.
|
> usar `write` para la primera parte y `edit` sucesivo para el resto.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Corrección de caracteres malformados (mojibake)
|
||||||
|
|
||||||
|
Los capítulos en español pueden acumular **codificación doble**: bytes UTF-8 almacenados como si
|
||||||
|
fuera Latin-1/CP1252, lo que genera mojibake visible como `ú`, `Práctica` o caracteres
|
||||||
|
`\xef\xbf\xbd` (replacement char) en vez de "práctica". Esto pasa cuando el parser JSON del tool
|
||||||
|
de escritura corrompe los bytes multibyte.
|
||||||
|
|
||||||
|
### Cómo detectar
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os
|
||||||
|
path = r"C:\Users\horacio\Desarrollo\c-programming\book\TU-CAPITULO.md"
|
||||||
|
with open(path, "rb") as f:
|
||||||
|
raw = f.read()
|
||||||
|
|
||||||
|
# Si hay bytes no ASCII pero el archivo se decodifica como UTF-8 bien formado,
|
||||||
|
# puede haber entidades HTML o caracteres dobles codificados.
|
||||||
|
|
||||||
|
try:
|
||||||
|
text = raw.decode("utf-8")
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
print("NO es UTF-8 — hay corrupción de encoding")
|
||||||
|
|
||||||
|
# Buscar replacement char U+FFFD (EF BF BD)
|
||||||
|
if b"\xef\xbf\xbd" in raw:
|
||||||
|
print("Encontrado replacement char — el archivo tiene mojibake")
|
||||||
|
|
||||||
|
# Buscar entidades HTML sueltas (ú, é, ñ)
|
||||||
|
for ent in [b"ú", b"é", b"ñ", b"á", b"ó", b"ú"]:
|
||||||
|
if ent in raw:
|
||||||
|
print(f"Entidad HTML detectada: {ent}")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cómo corregir (reconstruir UTF-8 limpio)
|
||||||
|
|
||||||
|
Si el archivo está corrupto, **borrar y reconstruir** desde un script Python que escriba en
|
||||||
|
UTF-8 nativo. El pattern probado en producción es:
|
||||||
|
|
||||||
|
1. **Borrar el archivo corrupto.** No intentes repararlo con `edit` — si ya tiene entidades HTML
|
||||||
|
mezcladas con bytes dobles, la reparación parcial deja residuos.
|
||||||
|
|
||||||
|
2. **Escribir con un script Python que use `encoding='utf-8'`.** El script construye el contenido
|
||||||
|
como strings de Python (que son Unicode internos) y lo escribe como bytes UTF-8 limpios.
|
||||||
|
No uses `write` del agente para contenido > 600 líneas.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# rebuild_chapter.py
|
||||||
|
chapter_file = r"C:\Users\horacio\Desarrollo\c-programming\book\25-drm-kms.md"
|
||||||
|
|
||||||
|
with open(chapter_file, "w", encoding="utf-8") as f:
|
||||||
|
f.write("# Capítulo 25 — DRM/KMS\n") # texto en Unicode → se escribe como UTF-8 limpio
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Si el contenido es largo**, dividí en chunks de ~250-300 líneas y uso `open(..., 'a')` para
|
||||||
|
append cada chunk al archivo ya creado.
|
||||||
|
|
||||||
|
4. **Verificar** que no queden caracteres corruptos:
|
||||||
|
```python
|
||||||
|
raw = open(path, "rb").read()
|
||||||
|
text = raw.decode("utf-8", errors="replace")
|
||||||
|
assert "\ufffd" not in text # sin replacement chars
|
||||||
|
for ent in [b"ú", b"é", b"ñ"]:
|
||||||
|
assert ent not in raw # sin entidades HTML sueltas
|
||||||
|
```
|
||||||
|
|
||||||
|
### Regla de prevención
|
||||||
|
|
||||||
|
> **Nunca pasar texto con acentos/ñ directamente en un string JSON `write`.** Si el contenido del
|
||||||
|
> capítulo tiene caracteres UTF-8 multibyte, escribirlo como un bloque grande en `write` puede
|
||||||
|
> corromper la codificación. La forma segura es: script Python que construya el Unicode interno y
|
||||||
|
> lo escriba con `encoding="utf-8"`.
|
||||||
|
|||||||
+2450
File diff suppressed because it is too large
Load Diff
Vendored
BIN
Binary file not shown.
Reference in New Issue
Block a user