46 lines
3.7 KiB
Markdown
46 lines
3.7 KiB
Markdown
# LEAD NOTE — mojibake trong `sub-w3-nghi-thuc.md` (khai thẳng, sửa MỘT PHẦN)
|
||
|
||
## Sự việc
|
||
`sub-w3-nghi-thuc.md` (26 KB) bị **mojibake ở nửa sau** — UTF-8 bị ghi như CP1252.
|
||
Bắt được lúc lead đọc verdict từ đĩa: `## §4 — (3) TIỀN-KIỂM…` thay vì `## §4 — (3) TIỀN-KIỂM…`.
|
||
|
||
## Đo (2 chiều, có control-dương)
|
||
| phép | kết quả |
|
||
|---|---|
|
||
| `U+FFFD` (ký tự thay thế = **mất byte**) | **0** ⇒ 🟢 **KHÔNG mất chữ nào**, chỉ mã hoá hai lần |
|
||
| mojibake ban đầu | **1.278** dấu hiệu |
|
||
| sau 4 vòng sửa | **1.226** — cải thiện, **KHÔNG hội tụ** |
|
||
| 🟢 **control-dương** | `sub-w2-luoi-ghi-dia.md` cùng thư mục = **0 mojibake** ⇒ không phải lỗi toàn kho, chỉ riêng lượt ghi này |
|
||
|
||
## Vì sao không sửa hết được
|
||
Các dòng bị **TRỘN** — đoạn hỏng và đoạn lành xen kẽ **không có ranh sạch**. Thử 4 cách, đều chỉ vá một phần:
|
||
1. theo DÒNG + `cp1252` strict → 20 dòng, 52 fail (dòng chứa ký tự ngoài bảng ⇒ cả dòng fail).
|
||
2. theo DÒNG + đa codec (`cp1252`/`latin-1`/`cp1258`), chỉ nhận nếu **giảm** mojibake → +5.
|
||
3. bảng ngược cp1252 đầy đủ 256 byte, lặp 3 lớp → +1.
|
||
4. theo ĐOẠN CON liên tiếp, lặp 3 vòng → 1.278 → 1.226.
|
||
|
||
## 🔴 Quyết định: DỪNG, không sửa tiếp
|
||
- Mỗi vòng ghi lại file = **một lần rủi ro hỏng thêm**; lợi ích biên đang giảm nhanh, rủi ro thì không.
|
||
- **Nội dung ĐỌC ĐƯỢC bằng mắt** (mojibake khả nghịch với người đọc) và **0 byte mất**.
|
||
- Cố cho đẹp lúc này = tối ưu **hình thức của bằng chứng** trong khi **bản thân bằng chứng đã nguyên vẹn** — đúng kiểu Goodhart mà cả phiên này đi bắt.
|
||
- 🔸 **Đường sửa triệt để nếu cần sau:** nhờ chính W3 viết lại các §4-§6 (nó còn nội dung trong context), hoặc đọc bản gốc từ `git log -p` nếu có commit trước lúc hỏng. **Không cấp bách.**
|
||
|
||
## Gốc kỹ thuật
|
||
Bẫy **PowerShell 5.1**: `Set-Content`/`Add-Content` mặc định **ANSI codepage**, không UTF-8. W3 hẳn đã đổi sang append bằng PowerShell ở nửa sau (nửa đầu sạch).
|
||
SE **đã biết lớp này** — `check-email.md` cảnh báo *"CẤM `Get-Content -Raw` cho hash — PS 5.1 đọc UTF-8-no-BOM bằng ANSI → mojibake → false-tamper (S125)"*. Cùng bẫy, chiều **ghi** thay vì chiều **đọc**.
|
||
|
||
## 🔴 Lỗ hổng THẬT lộ ra — đáng giá hơn cả bản vá
|
||
**`artifact-integrity.ps1` (W2) KHÔNG bắt được ca này.** Nó đo **cấu trúc** (placeholder ở heading · tỉ lệ ruột/khung · tệp rỗng · nguồn-2) — **không đo MÃ HOÁ**.
|
||
File này qua hết mọi vị từ W2: có ruột (63 dòng), 0 placeholder, có nguồn-2, không rỗng. **Sạch theo mọi thước đang có, mà hỏng thật.**
|
||
|
||
⇒ **Lại đúng luật W1-a:** *"một artifact sạch **chính xác tới độ sâu máy của nó KIỂM**, không sâu hơn một nấc."* W2 kiểm cấu trúc ⇒ sạch cấu trúc; **mã hoá là nấc chưa ai kiểm**.
|
||
|
||
**Đề xuất vị từ V-5 (chưa cắm, ghi để W6 hoặc anh phán):**
|
||
```
|
||
V-5 mojibake: dem ('§','â€','á','á»','ă') trong *.md; >0 => FLAG
|
||
+ control-duong: U+FFFD == 0 => "khong mat byte, sua duoc"
|
||
+ phan biet 2 nac: U+FFFD>0 = MAT DU LIEU (nang) ⟂ moji-only = SAI MA HOA (sua duoc)
|
||
```
|
||
🔸 **Rẻ, 1 dòng grep, 0 cấu hình** — cùng hạng với V-2 (vị từ mạnh nhất của W2).
|
||
🔸 **CẤM** gộp V-5 vào `LECH` của `naming-scan` — khác trục (tên ⟂ nội dung).
|