[BUG] Korean input characters disappear on iOS mobile SSH

Resolved 💬 13 comments Opened Dec 29, 2025 by wplong11 Closed Mar 27, 2026

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:

  1. Receives → inserts into buffer
  2. Receives DEL → deletes
  3. 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)

  1. Connect to a Linux server via SSH using Termius on iOS
  2. Run claude code
  3. Try to input Korean text in the prompt
  4. 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_

View original on GitHub ↗

This issue has 13 comments on GitHub. Read the full discussion on GitHub ↗