diff --git a/History/drhider-utf8-zip-2026-07-07.md b/History/drhider-utf8-zip-2026-07-07.md index 40c6529..d2ce52b 100644 --- a/History/drhider-utf8-zip-2026-07-07.md +++ b/History/drhider-utf8-zip-2026-07-07.md @@ -4,14 +4,23 @@ Кириллические имена файлов в выходном ZIP отображаются кракозябрами (CP437 вместо UTF-8). Содержимое файлов — OK. -## Причина -`zipfile.ZipFile` в режиме записи кодирует имена в CP437. -Python 3.12 `metadata_encoding='utf-8'` работает **только на чтение**, -при записи → `ValueError`. +## Причина (двойная) +1. **Мультипарт-парсер** в `drhider_server.py` декодирует HTTP-заголовки как `latin-1`, + но браузеры/curl шлют имена файлов в UTF-8. Результат — Mojibake. +2. **`_build_zip`** в `drhider.py` — `zipfile.ZipFile` в режиме записи кодирует + имена в CP437, флаг UTF-8 не ставится. ## Решение -Использовать `ZipInfo` с флагом UTF-8 (бит 11 = 0x800): +### Часть 1: мультипарт (drhider_server.py) +```python +name = os.path.basename(m.group(1)) +try: + name = name.encode('latin-1').decode('utf-8') +except (UnicodeDecodeError, UnicodeEncodeError): + pass +``` +### Часть 2: ZIP (drhider.py) ```python # Было: zf.writestr(fname, content) @@ -24,5 +33,11 @@ zf.writestr(info, content) ## Затронутые файлы - ВМ: `/home/naeel/contracts/drhider/drhider.py` → `_build_zip` +- ВМ: `/home/naeel/contracts/drhider/drhider_server.py` → multipart parser - `contracts-flask/deploy/drhider/drhider.py` +- `contracts-flask/deploy/drhider/drhider_server.py` - `contracts-flask/site/services/drhider.py` + +## Важно +- `metadata_encoding='utf-8'` НЕ РАБОТАЕТ в Python 3.12.3 на запись +- После правки `.py` → `rm -rf __pycache__` перед перезапуском diff --git a/deploy/drhider/drhider_server.py b/deploy/drhider/drhider_server.py index 9364dca..ea5819c 100644 --- a/deploy/drhider/drhider_server.py +++ b/deploy/drhider/drhider_server.py @@ -82,6 +82,10 @@ class Handler(BaseHTTPRequestHandler): if not m: continue name = os.path.basename(m.group(1)) + try: + name = name.encode('latin-1').decode('utf-8') + except (UnicodeDecodeError, UnicodeEncodeError): + pass if not name or ".." in name or "/" in name or "\\" in name: continue files.append((name, body, "")) diff --git a/site/templates/drhider.html b/site/templates/drhider.html index 1fe43fb..d788ec3 100644 --- a/site/templates/drhider.html +++ b/site/templates/drhider.html @@ -84,7 +84,7 @@ Сверка договоров | DrHider - v1.7 + v1.8 diff --git a/site/templates/index.html b/site/templates/index.html index 7efbacd..8dd8fc4 100644 --- a/site/templates/index.html +++ b/site/templates/index.html @@ -73,7 +73,7 @@
Nubes - Сверка договоров — LLM AI-driven Event Sourcing v1.0.194-flask + Сверка договоров — LLM AI-driven Event Sourcing v1.0.195-flask
○ Загрузка ○ Классификация