codepage: replace iconv with bundled WindowsBestFit tables

mt_codepage implements code pages 874/932/936/949/950/1250-1258 from
Microsoft's bestfit<cp>.txt sources (script/gen_codepage_tables.py,
SHA-256 pinned). Win32Crt's MultiByteToWideChar/WideCharToMultiByte/
IsDBCSLeadByteEx and net/text_codec use it, so the Android API 24 build
no longer depends on iconv. port.codepage checks every table against
its source file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-28 18:45:49 +09:00
co-authored by Claude Opus 5.5
parent 07c101fdc8
commit 0b701d88c3
12 changed files with 7068 additions and 191 deletions
+11 -2
View File
@@ -353,7 +353,16 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
| ~~Linux x86_64~~ | 不做(2026-09-23 定,见第 1 节) |
| ~~Windows x64~~ | 不做(2026-09-23 定,见第 1 节)。记录原因备查:上游 2.7 只支持 MSVC + `PC/pyconfig.h`,而本仓库的 Windows 门禁是 mingw-w64 交叉编译,`PC/pyconfig.h` 的 gnu-win32 分支不设 `HAVE_UNISTD_H`,`posixmodule.c`/`dynload_win.c` 与 MinGW 头文件冲突。因此 mingw 门禁下不建 `mtpython`,`port_logic`/`port_platform` 自动排除 ScriptLib |
### 已知问题:Android 的 GBK 编解码(挂起,2026-09-23)
### 已解决:Android 的 GBK 编解码(2026-09-28)
`extension/src/codepage`(`mt_codepage`)按微软 WindowsBestFit 表实现 874/932/936/949/950/1250–1258,
`Win32Crt.cpp` 的 `MultiByteToWideChar`/`WideCharToMultiByte`/`IsDBCSLeadByteEx` 和 `net/text_codec.cpp` 都改用它,
iconv 已全部移除。表由 `script/gen_codepage_tables.py` 从 unicode.org 下载(SHA-256 固定)生成;
`port.codepage` 测试逐条校验 14 张表与源文件一致(解码全部单字节/双字节序列,编码全部 BMP 码位,含/不含 best fit)。
与 macOS iconv 一次性逐字对比:CP936 22,111 个码位一致,差异只在 Windows 特有的部分——0x80→€、EUDC 用户造字区映射到
私用区(U+E000–F8FF,1,955 个)、A2E3/A8BF 两处;1250/1251/1253/1254 只差未定义字节(Windows 映射为 C1 控制码)。下面是当时的分析记录。
#### 原记录(2026-09-23)
**优先级:macOS 先跑通,Android 后面再说**(用户 2026-09-23 定)。
@@ -515,7 +524,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
`Eternexus/root/*.msm` 的路径、大小、sha256,结果在 `audit/assets/40250-client.json`(223 个文件,1,407,474,045
字节)。文件缺失、内容变化或清单外多出的文件都会让 verify 失败。
已知问题(不是本批引入的):完整 Android 链接在 API 24 上失败,原因是 `extension/src/net/text_codec.cpp` 用了 iconv;
已知问题(不是本批引入的,2026-09-28 已随 `mt_codepage` 解决):完整 Android 链接在 API 24 上失败,原因是 `extension/src/net/text_codec.cpp` 用了 iconv;
本批的 mtproto、`pack40250_node`、`asset_io`、`proto_node` 都能在 Android 上编译。
## 6. 进度与 port-map 基线