unicode-safe-file-writing
How to reliably write files containing multi-byte Unicode (emoji, special symbols) when write_file fails with 'unknown error' by falling back to run_shell with a heredoc.
- License 许可
- MIT
- 所属仓库
- HKUDS/AgentPilot
- 最近更新
- 2026-11-06
- Stars
- ★ 8.0k
- Forks
- 938
01 前言 Front Matter
- name
- unicode-safe-file-writing
- description
- How to reliably write files containing multi-byte Unicode (emoji, special symbols) when write_file fails with 'unknown error' by falling back to run_shell with a heredoc.
02 资源文件 1
- 其他.skill_id39 B
03 SKILL.md 正文
Unicode-Safe File Writing
Problem
The write_file tool may fail with 'unknown error' when the file content
contains multi-byte Unicode characters such as:
- Emoji (e.g.
?,✅,❌) - Special typographic symbols (e.g.
→,•,—,©) - Non-ASCII characters outside the Latin-1 range
This is a known encoding limitation of write_file.
Solution
Fall back to run_shell and write the file using a shell heredoc
(cat > file << 'EOF' ... EOF). The single-quoted delimiter 'EOF'
prevents the shell from interpreting any special characters inside the
block.
Step-by-Step Recovery
Step 1 — Detect the failure
If write_file returns an error such as:
Error: unknown error
and the content contains non-ASCII characters, assume a Unicode encoding issue and proceed to the heredoc fallback.
Step 2 — Strip or replace problematic characters (if needed)
Before embedding content in the heredoc, decide whether to:
- Keep the characters as-is (works if the shell/terminal is UTF-8 aware)
- Replace emoji/symbols with ASCII equivalents (safest, most portable)
- Remove them entirely
Common replacements:
| Original | Replacement |
|---|---|
✅ |
[OK] |
❌ |
[ERROR] |
? |
[START] |
→ |
-> |
• |
- |
— |
-- |
Step 3 — Write the file via heredoc
Use run_shell with the following pattern:
cat > path/to/file.ext << 'EOF'
...file content here (with Unicode stripped/replaced if needed)...
EOF
Key details:
- Use
'EOF'(single-quoted) as the heredoc delimiter — this disables all shell variable expansion and special character interpretation inside the block. - Do not indent the closing
EOF(it must start at column 0). - For deeply nested content, choose a delimiter that cannot appear in the
content itself (e.g.
'HEREDOC_END','FILEEND').
Example
Failing call
write_file(
path="src/components/StatusPanel.ts",
content="// Status icons\nconst icons = { ok: '✅', err: '❌', run: '?' };\n"
)
# → Error: unknown error
Recovery via heredoc
cat > src/components/StatusPanel.ts << 'EOF'
// Status icons
const icons = { ok: '[OK]', err: '[ERROR]', run: '[START]' };
EOF
Or, if UTF-8 output is acceptable in the environment:
cat > src/components/StatusPanel.ts << 'EOF'
// Status icons
const icons = { ok: '✅', err: '❌', run: '?' };
EOF
Multi-File Scenario
When writing several files and one fails, write the others with write_file
as normal and apply the heredoc fallback only to the failing file(s):
# Write multiple files that contain Unicode
cat > src/utils/icons.ts << 'EOF'
export const ICONS = {
success: '[OK]',
failure: '[FAIL]',
pending: '[...]',
};
EOF
cat > src/utils/labels.ts << 'EOF'
export const LABELS = {
title: 'Dashboard',
subtitle: 'Real-time status',
};
EOF
Important Notes
- Always prefer
write_filefirst — only fall back to the heredoc approach whenwrite_filefails. - Verify after writing — use
run_shellwithcat path/to/fileorhead -5 path/to/fileto confirm the content was written correctly. - Directory creation —
write_fileauto-creates parent directories; the heredoc approach does not. Pre-create directories withmkdir -p path/to/dirif needed. - Large files — heredocs work well for files of any practical size; there is no meaningful shell limit.
- Escaping backslashes — inside a single-quoted heredoc, backslashes are treated literally (no escaping needed), which is usually desirable.
04 同仓库更多 Skills
agentpilot
Set up AgentPilot and use its single entry to prepare missing inputs and run configured RSI experiments. Use when the user requests AgentPilot installation or work with AgentPilot.
remember
Review auto-memory entries and propose promotions to OPENSPACE.md, OPENSPACE.local.md, or retained auto-memory topics; detect duplicates, stale facts, conflicts, and ambiguous entries before making changes.
skill-discovery
Search reusable OpenSpace skills locally, and browse cloud packages step by step when a cloud skill may help. Reusing proven skills saves tokens, improves reliability, and extends your capabilities beyond built-in tools.
delegate-task
Delegate tasks to OpenSpace — a full-stack autonomous worker for coding, DevOps, web research, and desktop automation, backed by an extensive MCP tool and skill library. Skills auto-improve through use, reducing token consumption over time. A cloud community lets agents share and collectively evolve reusable skills.
write-special-chars-ts-check
Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, plus a reliable TypeScript type-checking step that filters output to only the newly-written files to avoid being misled by pre-existing errors.
write-special-chars-readback
Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, with mandatory post-write verification via read_file and cleanup of /tmp helper scripts.