3.7 KiB
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:
- theo DÒNG +
cp1252strict → 20 dòng, 52 fail (dòng chứa ký tự ngoài bảng ⇒ cả dòng fail). - theo DÒNG + đa codec (
cp1252/latin-1/cp1258), chỉ nhận nếu giảm mojibake → +5. - bảng ngược cp1252 đầy đủ 256 byte, lặp 3 lớp → +1.
- 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 -pnế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).