Skip to content

Terminal v1.0.3

Choose a tag to compare

@FPS1024 FPS1024 released this 20 Sep 12:35
· 9 commits to main since this release

越狱 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>) —— 61170e0

    pick_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。