Multilingual Markdown

Every markdown tool claims to support Unicode, which is true and not very useful — storing the characters is the easy part. What actually breaks is narrower and more specific: emphasis that will not close in Chinese, a heading marker typed in full width, a URL that eats the sentence after it, a password that unlocks on one machine and not another.

This page covers the cases that genuinely need handling, and what MarkdownBin does about each. Every example renders live through the same pipeline that renders pastes.

Any script, no configuration

Markdown syntax is ASCII, but the text around it is not restricted. Headings, lists, emphasis and tables all work the same whatever script you write in — nothing needs to be declared or switched on.

You write
# Примечания к выпуску

## Notas de la versión

### 릴리스 노트

- **Исправлено:** утечка памяти
- **Corregido:** fuga de memoria
- **수정됨:** 메모리 누수

| Язык | Статус |
| --- | --- |
| Русский | Готово |
| Español | En curso |
You get

Примечания к выпуску

Notas de la versión

릴리스 노트

  • Исправлено: утечка памяти
  • Corregido: fuga de memoria
  • 수정됨: 메모리 누수
ЯзыкСтатус
РусскийГотово
EspañolEn curso

Only the markers themselves have to be ASCII. The text after them is unrestricted, and mixing scripts within one document needs nothing special.

The full-width trap

Markdown markers must be the ASCII characters. An input method that produces full-width forms gives you # instead of #, or a full-width space after the hash — and the line silently stays a paragraph instead of becoming a heading.

You write
# これは見出しになりません

- これも箇条書きになりません

> これも引用になりません

# これは見出しです
- これは箇条書きです
You get

# これは見出しになりません

- これも箇条書きになりません

> これも引用になりません

これは見出しです

  • これは箇条書きです

The first three lines use # - > (full-width) and render as plain text; the last two use # and - (ASCII) and work. A full-width space after a correct # fails the same way, which is the hardest version to spot because the line looks right.

Right-to-left: Arabic and Hebrew

Pastes are rendered with direction detected from the content, so a document written in Arabic or Hebrew aligns to the right and its list markers and quote borders move to the correct side.

You write
# ملاحظات الإصدار

- تم إصلاح تسرب الذاكرة
- تمت إضافة دعم التشفير

> اقرأ هذا القسم أولاً.

الكود `config.toml` يبقى من اليسار إلى اليمين.
You get

ملاحظات الإصدار

  • تم إصلاح تسرب الذاكرة
  • تمت إضافة دعم التشفير

اقرأ هذا القسم أولاً.

الكود config.toml يبقى من اليسار إلى اليمين.

Direction is taken from the first strong directional character in the document. A file that opens with an English title and continues in Arabic will lay out left-to-right — start with the Arabic heading, or keep the two languages in separate pastes.

Mixing code into right-to-left prose

Latin identifiers, file paths and URLs inside RTL text keep their own direction. This is the Unicode bidirectional algorithm doing its job, and it is why a path can appear to jump position mid-sentence.

You write
عدّل الملف `src/lib/crypto.ts` ثم أعد التشغيل.

```ts
const مفتاح = "قيمة"
```

راجع https://mdbin.sivaramp.com للمزيد.
You get

عدّل الملف src/lib/crypto.ts ثم أعد التشغيل.

ts
const مفتاح = "قيمة"

راجع للمزيد.

Inside a fenced code block the text is left-to-right regardless of the surrounding page, which is what you want — code direction should not follow prose direction.

Chinese, Japanese and Korean

CJK text has one genuine markdown bug: emphasis markers next to full-width punctuation fail to close, and bare URLs swallow the punctuation after them. Both are corrected here.

You write
**重要な変更(破壊的)。**必ずお読みください。

詳細は https://mdbin.sivaramp.com。こちらを参照。
You get

重要な変更(破壊的)。必ずお読みください。

詳細は 。こちらを参照。

Standard markdown renders the asterisks above as literal characters and puts 。こちらを参照。 inside the link URL. There is a full page of cases at /cjk-markdown.

How the size limit counts

The 100,000 limit counts characters, not bytes — so non-Latin text is not penalised for needing more bytes per character. In UTF-8 terms the ceiling is considerably higher than the number suggests.

You write
| Script | Bytes per character | 100,000 characters is |
| --- | --- | --- |
| English | 1 | ~98 KB |
| Russian, Greek, Arabic | 2 | ~195 KB |
| Chinese, Japanese, Korean | 3 | ~293 KB |

Encrypted pastes cap at 75,000 instead, because
base64 expands the ciphertext.
You get
ScriptBytes per character100,000 characters is
English1~98 KB
Russian, Greek, Arabic2~195 KB
Chinese, Japanese, Korean3~293 KB

Encrypted pastes cap at 75,000 instead, because base64 expands the ciphertext.

The one place this works against you is emoji. Characters outside the Basic Multilingual Plane take two units each, so an emoji costs the same as two Chinese characters.

Emoji, including the composed ones

Emoji are ordinary text and need no special syntax. The ones built from several code points joined together survive a round trip intact — they are stored and rendered as written.

You write
## Status 🚀

- [x] Encryption 🔒
- [ ] Expiry ⏳

Family: 👨‍👩‍👧 · Flag: 🇯🇵 · Wave: 👋

| Team | Mood |
| --- | --- |
| Backend | 😌 |
| Frontend | 🔥 |
You get

Status 🚀

  • Encryption 🔒
  • Expiry ⏳

Family: 👨‍👩‍👧 · Flag: 🇯🇵 · Wave: 👋

TeamMood
Backend😌
Frontend🔥

A joined emoji like 👨‍👩‍👧 is five code points held together by invisible joiners and counts as eight toward the size limit, despite looking like one character. It only matters near the ceiling.

Passwords in non-Latin scripts

Encryption passwords are normalised before the key is derived, so a password containing accents or Hangul unlocks the paste regardless of which device or keyboard produced it.

You write
Passwords that are the same to a reader but not
to a computer, before normalisation:

| Password | Composed | Decomposed |
| --- | --- | --- |
| `café2024` | 9 bytes | 10 bytes |
| `한국어pass` | 13 bytes | 28 bytes |

Both forms now derive the same key.
You get

Passwords that are the same to a reader but not to a computer, before normalisation:

PasswordComposedDecomposed
café20249 bytes10 bytes
한국어pass13 bytes28 bytes

Both forms now derive the same key.

macOS commonly produces the decomposed form while other systems produce the composed one. Without normalisation the same typed password derives a different key and fails — and since there is no recovery by design, that would lock the paste permanently.

Code and comments in any language

Syntax highlighting works on the structure of the language, not the alphabet of its identifiers. Non-ASCII variable names, strings and comments highlight normally.

You write
```python
# Вычисление среднего значения
def среднее(числа):
    return sum(числа) / len(числа)
```

```js
// 挨拶を返す
const 挨拶 = (名前) => `こんにちは、${名前}`
```
You get
python
# Вычисление среднего значенияdef среднее(числа):    return sum(числа) / len(числа)
js
// 挨拶を返すconst 挨拶 = (名前) => `こんにちは、${名前}`

Both examples are highlighted by Shiki, the same highlighter VS Code uses, so the result matches what you already see in your editor.

Paste in whatever language you write in

No signup, no language setting, nothing to configure. If you have markdown that renders wrongly somewhere else, paste it here and compare — and encrypt it if it should not be public.