1,453,506 AI resources indexedWorking toward the world’s largest AI resource index.

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.

Installable skillMITBy AG064Updated Oct 28, 2026
INTENDED FOROpenClawInstall in a listed agent.

instructions.md

---
name: unicode-safe-file-writing-44bc8fcdd315
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.
---

# 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:

```bash
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

```python
write_file(
    path="src/components/StatusPanel.ts",
    content="// Status icons\nconst icons = { ok: 'βœ…', err: '❌', run: 'πŸš€' };\n"
)
# β†’ Error: unknown error
```

### Recovery via heredoc

```bash
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:

```bash
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):

```bash
# 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

1. **Always prefer `write_file` first** β€” only fall back to the heredoc
   approach when `write_file` fails.
2. **Verify after writing** β€” use `run_shell` with `cat path/to/file` or
   `head -5 path/to/file` to confirm the content was written correctly.
3. **Directory creation** β€” `write_file` auto-creates parent directories;
   the heredoc approach does not. Pre-create directories with
   `mkdir -p path/to/dir` if needed.
4. **Large files** β€” heredocs work well for files of any practical size;
   there is no meaningful shell limit.
5. **Escaping backslashes** β€” inside a single-quoted heredoc, backslashes
   are treated literally (no escaping needed), which is usually desirable.

Platform guidance

Imported from the listed AgentSkill.sh category. Complete supplied package files and notices are retained. Required external tools and credentials are not installed. No bundled code was executed during import. Individual agent task behavior has not been tested.