Repository navigation
Terminal v1.0.3
越狱 iOS 设备的终端 App,最低支持 iOS 12.0。终端仿真核心(VT100/xterm、UTF-8、中文与 emoji 列宽、256 色与真彩色、回滚与 reflow)为纯 C,界面层是 Objective-C + UIKit。
这一版修的是「中文能打进去、shell 里回显的却是乱码」:问题出在 shell 的 locale 上,跟输入法本身没关系。
安装
rootless 越狱(Dopamine / Palera1n 等)— 推荐
- 文件:
Terminal_1.0.3_iphoneos-arm64.deb - 安装位置:
/var/jb/Applications/Terminal.app - 方式:
dpkg -i Terminal_1.0.3_iphoneos-arm64.deb,或用 Sileo / Zebra 的「本地安装」 postinst会自动执行uicache并刷新 SpringBoard
从 1.0.2 直接覆盖安装即可,bundle id 没变,设置与会话不受影响。
本版修复
-
zsh 里键入中文回显成乱码(
echo ��<00ad>�<0096><0087>) ——61170e0pick_lang()原来靠 stat/usr/share/locale/<name>目录在不在来挑 locale,可这跟 libc 认不认这个名字是两回事:C.UTF-8、zh_CN.utf8在 macOS 与 iOS 上都没有数据,最后兜底那句"en_US.UTF-8"更是从来没验证过。名字一旦无效,shell 就停在 C locale,zsh 的 ZLE 掉进单字节模式,把中文按<00ad>这种记法回显出来;而此时命令其实已经正确执行,cat也完全正常(那是内核行规程的回显,不经过 ZLE),所以看起来很像"输入没送进终端"。bash 的 readline 会把字节原样吐出来 —— 这就是同一个环境里 bash 看着正常、只有 zsh 不正常的由来。 -
现在改为直接问 libc:
newlocale(LC_CTYPE_MASK)建得出来、且wcwidth_l(0x4E2D) == 2,才算这个 locale 可用,按zh_CN.UTF-8→en_US.UTF-8→UTF-8挑。并把LANG/LC_CTYPE/LC_ALL一起设成这个真正可用的名字:LC_ALL优先级最高,所以~/.zshrc里残留的export LANG=C.UTF-8(甚至LC_CTYPE=C.UTF-8)也不会再让 zsh 掉回单字节模式;而如果设备上只有 LC_CTYPE 可用(Darwin 的UTF-8就是这种),就只设LC_CTYPE,免得setlocale(LC_ALL, "")整体失败反而更糟。
其他变更
out/里从此只放一个 deb(make ios的 App 挪到build/Terminal.app),不再产出 ipa ——32e7ebc$TERM_PROGRAM_VERSION改为构建时注入,跟着版本号走(原来写死1.0)- 不用再手动
export LANG=C.UTF-8(C.UTF-8是 Linux 的东西,Darwin 上没有),README 已补上说明
校验
| 文件 | SHA256 |
|---|---|
Terminal_1.0.3_iphoneos-arm64.deb |
2cc7e11d76cd87d5a54b2d0a2d3b3f3d5125f824fd0c2f0c04b74fd858212f0a |
复现与验证都在真 shell 上做的:起 /bin/zsh 逐字节键入 echo 中文,LANG/LC_CTYPE/LC_ALL=zh_CN.UTF-8 与「只设 LC_CTYPE=UTF-8」两种情况回显与输出均正常,只设 LANG=C.UTF-8(旧行为)则复现出上面的乱码。make test 173 项断言全过。
App 图标提取自 macOS 内置的 Terminal.app,属 Apple 的美术资源,不在本项目 MIT 许可的授权范围内;源代码许可见 LICENSE。