Claude Code Korean Text Corrupted? Stop Unicode Escapes

Claude Code Korean Text Corrupted? Stop Unicode Escapes

Aident AI

Ivory modular tiles align on a cyan guide while one coral fragment marks a repaired break in the sequence.

Claude Code Korean Text Corrupted? Stop Unicode Escapes

If Claude Code shows readable Korean in normal replies but turns tool questions, task labels, or option descriptions into wrong Hangul syllables, add one explicit instruction to CLAUDE.md:

Always write Korean and other non-ASCII strings in tool-call parameters as literal UTF-8. Never encode them as \uXXXX escape sequences

Start a new Claude Code session, verify that the file is loaded with /memory, and repeat the same tool-heavy task. This targets a specific Sonnet 5 failure mode reported in August 2026: the model writes Korean tool parameters as hand-spelled Unicode escapes and produces valid but incorrect code points. It does not fix every kind of Korean text corruption, so identify the signature before changing terminal or locale settings.

Match the Symptom to the Right Fix

What you see

Likely boundary

Next action

Wrong but valid Hangul inside AskUserQuestion, task, or tool fields

Model wrote incorrect \uXXXX escapes

Add the literal UTF-8 instruction

The replacement character appears in streamed output

UTF-8 stream decoding or an older client path

Update Claude Code and capture the client version

Korean typing is broken before you submit a prompt

Terminal, IDE, or IME input

Test the same text outside Claude Code

Korean gradually becomes repetitive or drifts to English

Separate long-session model behavior

Save a minimal transcript and open a distinct report

Only one generated file is corrupted

File-writing or encoding path

Inspect the file bytes and editor encoding

The distinction matters. Changing LANG, reinstalling an IDE, or switching fonts cannot repair wrong Unicode code points that are already present in parsed tool input. Conversely, a CLAUDE.md instruction cannot repair an IME problem or a stream that has already emitted U+FFFD replacement characters.

Prerequisites

Before testing, record the version and preserve one small example:

claude --version
locale

On Windows PowerShell, use:

claude --version
Get-Culture

Copy the corrupted text, the intended text, the tool surface where it appeared, and whether ordinary assistant prose stayed readable. Do not include API keys, private source code, customer data, or complete session logs in a public issue.

Expected result: you can tell whether the failure affects tool-call parameters specifically or all Korean input and output.

Step 1: Confirm the Escape-Writing Signature

The August 1 root-cause report gives a recognizable pattern:

  • ASCII, digits, and UI labels such as Other remain intact.

  • Korean content words become different but valid Hangul syllables rather than .

  • The failure appears in structured tool input, especially question and task fields.

  • Session JSONL may show only the already-decoded wrong syllable because JSON escapes were parsed before persistence.

For example, the report observed intended words such as 점검 and 완료 arriving as other valid syllables. That is not mojibake. The bytes decode successfully, but they decode to the wrong code points.

Expected result: if you see valid but nonsensical Hangul in a tool card while surrounding ASCII is clean, continue with the prompt-level guard. If you see , broken keyboard input, or corruption everywhere, skip to the separate-failure section.

Step 2: Add a Literal UTF-8 Rule at the Correct Scope

For one shared repository, add the instruction to the project file at ./CLAUDE.md or ./.claude/CLAUDE.md:

## International text

- Always write Korean and other non-ASCII strings in tool-call parameters as literal UTF-8. Never encode them as `\uXXXX` escape sequences

For every project on your machine, put the same rule in ~/.claude/CLAUDE.md. For a private project-specific preference that should not be committed, use ./CLAUDE.local.md and keep it ignored by Git.

Do not add the same rule at all three scopes. Claude concatenates applicable instruction files, so one clear source is easier to maintain and test.

Expected result: the next session receives one concise instruction at the intended project or user scope.

Step 3: Verify Claude Code Loaded the Rule

Start a new session in the affected repository and run:

/memory

Confirm that the chosen CLAUDE.md or CLAUDE.local.md appears in the loaded file list. Anthropic documents these files as persistent context, not hard enforcement, so a missing file means the model never received the workaround.

Then repeat the smallest task that previously produced corrupted tool input. Keep the wording and model constant. A useful manual test asks Claude to present several Korean choices through the same question tool that failed, without accessing a real service or writing production data.

Expected result: the tool card contains literal, readable Korean and no syllable substitutions. The issue reporter's controlled experiment found corruption in all 45 escape-writing runs across two accounts, while forbidding escapes suppressed that class in the tested field workflow. Treat that as strong reproduction evidence for this signature, not proof that all Korean model errors are solved.

Step 4: Capture Raw Partial JSON Only When Needed

If the visual tool card is still wrong, capture a minimal print-mode reproduction with partial messages:

claude -p 'Use the available question-style tool with three Korean options. Keep every Korean string literal UTF-8.' \
  --output-format stream-json \
  --verbose \
  --include-partial-messages \
  > claude-korean-repro.jsonl

Search the raw file for escaped code points:

rg -n '\\\\u[0-9A-Fa-f]{4}' claude-korean-repro.jsonl

The file can contain prompts, tool arguments, paths, and model output. Keep it local, redact it before sharing, and delete it when the investigation is finished.

Expected result: raw partial_json evidence can distinguish model-written escapes from a display problem. If the parsed transcript is wrong but the raw stream contains no escapes, report that as a separate literal-output failure rather than forcing this workaround to fit.

Step 5: Keep the Workaround Narrow

Avoid broad changes that hide the actual boundary:

  • Do not escape all non-ASCII output yourself. That recreates the failure condition.

  • Do not rewrite generated Korean with a character-normalization pass. Normalization cannot infer the intended syllable from a different valid syllable.

  • Do not disable tools globally if the same workflow succeeds with literal UTF-8.

  • Do not publish a raw session log. Produce the smallest redacted reproduction.

  • Do not claim a terminal locale fixed a tool-parameter model error unless an A/B test shows it.

If your application calls the Claude API directly, place the same literal UTF-8 requirement in the system instruction that governs every tool parameter. Validate business-critical Korean fields before executing a write, and reject or request regeneration when content is unreadable. A validator can catch replacement characters or invalid JSON, but it cannot reliably recognize every valid-yet-wrong Hangul syllable. Human review remains necessary for high-impact Korean text.

Common Failure Modes

Failure

Better response

The rule was added but the old session still fails

Start a new session and check /memory

Normal chat is clean but a question card is wrong

Keep the test focused on structured tool input

rg finds nothing but the UI is corrupted

Capture the raw boundary and file a separate literal-output report

appears after upgrading

Include the exact client version and stream mode in the report

The workaround fixes some runs but not rare substitutions

Record the residual separately; the root-cause report describes a distinct low-rate class

A team duplicates the rule in many nested files

Keep one project or user source of truth

Why This Fix Works

JSON permits both literal UTF-8 and Unicode escape syntax. For Korean, literal UTF-8 lets the model emit the intended text directly. Writing every syllable as four hexadecimal digits creates several additional opportunities for a near-miss that still decodes into a valid Hangul character. Because the JSON parser then removes the escape notation, the final session record can preserve only the wrong syllable and conceal how it was produced.

The fix mirrors the repeatable structure behind Aident's Ollama network guide: name the exact failure, test one boundary, apply a reversible change, verify the expected result, and explain why it works. If your symptom is instead a missing instruction file, use Claude Code Memory Missing in a Worktree?. If tool output is consuming too much context, see How to Reduce MCP Token Usage in Claude Code and Codex.

Verify Three Catalog Results in Korean

After the rule works, set up Aident Loadout by pasting:

Follow https://aident.ai/SETUP.md

Then ask:

Check my Aident Loadout account and Vault status.
Search the staging capability catalog for Fal, Gladia, and Hacker News.
Return exactly one current Action for each family with its canonical name,
required connection, and risk level, then explain each result in Korean.
Write every Korean and non-ASCII tool parameter as literal UTF-8, never as
Unicode escape sequences. Do not execute a provider Action or change a connection

Expected result: three current catalog records, three readable Korean explanations, and zero provider executions. That tests the workaround on a real structured capability workflow without copying API keys or changing an external system.

Sources

Refresh this guide when Anthropic resolves issue 83033, changes Sonnet 5's tool-parameter behavior, or documents a client-side validation fix.

Home

Home

Home

Integrations

Integrations

Integrations

Vault

Vault

Vault

Audit

Audit

Audit

Arana Grande

Arana Grande

Arana Grande

Free

Free

Free

30-day audit summary

30-day audit summary

30-day audit summary

Daily action-call volume and the latest receipts from the Loadout audit trail.

Daily action-call volume and the latest receipts from the Loadout audit trail.

Daily action-call volume and the latest receipts from the Loadout audit trail.

View Audit

View Audit

View Audit

Loadout usage

Loadout usage

Loadout usage

617 action calls in the last 30 days

617 action calls in the last 30 days

617 action calls in the last 30 days

May 19 - Jun 17

May 19 - Jun 17

May 19 - Jun 17

10 active days

10 active days

10 active days

Less

Less

Less

More

More

More

Recent activity

Recent activity

Recent activity

Latest action-call receipts from connected agents

Latest action-call receipts from connected agents

Latest action-call receipts from connected agents

Apr 23, 09:23 AM

Apr 23, 09:23 AM

Apr 23, 09:23 AM

Shopify

Shopify

Shopify

Creates Or Updates An Asset For A Theme

Creates Or Updates An Asset For A Theme

Creates Or Updates An Asset For A Theme

Success

Success

Success

Apr 23, 09:21 AM

Apr 23, 09:21 AM

Apr 23, 09:21 AM

Shopify

Shopify

Shopify

Update Products Param Product Id

Update Products Param Product Id

Update Products Param Product Id

Success

Success

Success

Apr 23, 08:53 AM

Apr 23, 08:53 AM

Apr 23, 08:53 AM

Shopify

Shopify

Shopify

Update Products Param Product Id

Update Products Param Product Id

Update Products Param Product Id

Failed

Failed

Failed

Apr 22, 22:13 PM

Apr 22, 22:13 PM

Apr 22, 22:13 PM

Shopify

Shopify

Shopify

Create Product Image

Create Product Image

Create Product Image

Success

Success

Success

Apr 22, 22:12 PM

Apr 22, 22:12 PM

Apr 22, 22:12 PM

Shopify

Shopify

Shopify

Create Product Image

Create Product Image

Create Product Image

Success

Success

Success

Connected integration coverage

Connected integration coverage

Connected integration coverage

162

162

162

of 753 accessible connected

of 753 accessible connected

of 753 accessible connected

Callable actions

Callable actions

Callable actions

1,126

1,126

1,126

Vault credentials

Vault credentials

Vault credentials

8

8

8

Explore what's possible

Explore what's possible

Explore what's possible

See all Integrations

See all Integrations

See all Integrations

Google Ads

Google Ads

Google Ads

All available Goolge Ads tools via...

All available Goolge Ads tools via...

All available Goolge Ads tools via...

X (twitter)

X (twitter)

X (twitter)

All available X tools via...

All available X tools via...

All available X tools via...

Github

Github

Github

All available Github tools via...

All available Github tools via...

All available Github tools via...

Notion

Notion

Notion

All available Notion tools via...

All available Notion tools via...

All available Notion tools via...

Slack

Slack

Slack

All available Slack tools via...

All available Slack tools via...

All available Slack tools via...

Firecrawl

Firecrawl

Firecrawl

All available Firecrawl tools via...

All available Firecrawl tools via...

All available Firecrawl tools via...

753 integrations are available for loadouts.

753 integrations are available for loadouts.

753 integrations are available for loadouts.

Plug your entire stack into your AI agents.

Plug your entire stack into your AI agents.

Plug your entire stack into your AI agents.

Skip the integration headache. Plug 750+ tools into Claude Code, Codex, and OpenClaw in one go, and let your agents execute today.

Skip the integration headache. Plug 750+ tools into Claude Code, Codex, and OpenClaw in one go, and let your agents execute today.