[BUG] Korean input characters disappear on iOS mobile SSH
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Summary
When connecting via Termius on iOS and running Claude Code over SSH,
Korean input characters disappear at the moment a consonant and vowel are combined.
- Consonant only: works
- Vowel only: works
- Consonant + vowel (e.g.
ㄱ+ㅏ→가): character disappears
⚠️ In the same Termius environment:
- ✅ Android: works correctly
- ❌ iOS: issue occurs
Other CLI/TUI tools such as Gemini CLI and Codex CLI work correctly even on iOS.
Screen Recording
https://github.com/user-attachments/assets/5d2d9796-7ecd-435e-8eb1-0abf334a9f7c
Environment
- Client
- ❌ iOS + Termius (issue occurs)
- ✅ Android + Termius (works)
- Server
- MacOS (SSH)
- Affected application
- Claude Code
- Not affected
- MacOS Terminal / iTerm2
- Gemini CLI
- Codex CLI
Actual Behavior
- During Korean jamo composition, the input buffer deletes the character and the final composed character is not rendered
Technical Analysis (Important)
iOS Termius input behavior
When typing the Korean character 가 on iOS Termius, the actual byte stream received by the server (logged in raw TTY mode) is:
e3 84 b1 7f ea b0 80
Interpretation:
- e3 84 b1 →
ㄱ(U+3131) - 7f → DEL (backspace)
- ea b0 80 →
가(U+AC00)
This means iOS Termius does not send IME preedit composition to the server.
Instead, it emulates composition using a delete + re-insert sequence:ㄱ → delete → 가.
Claude Code appears to mis-handle this sequence:
- Receives
ㄱ→ inserts into buffer - Receives DEL → deletes
ㄱ - Receives final character
가→ insertion is dropped due to internal input state or cursor calculation
As a result, no character remains on screen.
Why this does not occur on Android
On Android Termius:
- Korean IME composition is completed on the client side
- SSH sends only the final composed UTF-8 characters
This matches the behavior of macOS terminals, so Claude Code never receives the delete + re-insert sequence and works correctly.
Why this does not occur on macOS
- macOS Terminal / iTerm2 complete IME composition locally
- SSH transmits only finalized UTF-8 characters
- Claude Code never encounters the problematic delete + insert sequence
Additional Notes
- Changing Termius backspace transmission from DEL (0x7f) to Ctrl-H (0x08):
- Does not fully resolve the issue in Claude Code
- Can introduce input issues in other terminal applications
Conclusion
- This is not a locale, UTF-8, or font configuration issue
- The issue reproduces only on iOS, while Android and macOS work correctly
- Claude Code’s raw TUI input handling does not correctly process
the delete + re-insert based IME composition sequence used by iOS Termius
- To support iOS mobile SSH environments, Claude Code needs:
- Safe handling of IME composition or delete + insert sequences
- Or an alternative line-based / IME-safe input mode
Impact
- Korean (and likely other CJK) input is effectively unusable in Claude Code on iOS
- Copy/paste is the only practical workaround
What Should Happen?
Expected Behavior
- Korean input should be composed and rendered correctly (
가,나,다, etc.)
Error Messages/Logs
Steps to Reproduce
Steps to Reproduce (100% on iOS)
- Connect to a Linux server via SSH using Termius on iOS
- Run
claude code - Try to input Korean text in the prompt
- Example: input
가
- Type
ㄱ→ briefly appears - Type
ㅏ→ the character disappears
Test for checking text input
$ cat > /tmp/ttylog.py <<'PY'
import sys, tty, termios
fd = sys.stdin.fileno()
if not sys.stdin.isatty():
print("stdin is not a TTY. Run this in an interactive SSH shell.", file=sys.stderr)
sys.exit(1)
old = termios.tcgetattr(fd)
try:
tty.setraw(fd)
print("RAW tty logger started. (Press Ctrl-\\ to quit)")
while True:
b = sys.stdin.buffer.read(1)
if not b:
break
sys.stdout.write(b.hex() + " ")
sys.stdout.flush()
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old)
PY
$ python3 /tmp/ttylog.py
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
2.0.76
Platform
Anthropic API
Operating System
Other
Terminal/Shell
Other
Additional Information
_No response_
This issue has 13 comments on GitHub. Read the full discussion on GitHub ↗