Parser reliability

CJK and Emoji Width in Plain-Text Tables

Written and reviewed by the md2text maintainer. Parser-specific guidance is checked against the automated regression suite.

Plain-text table alignment depends on visible width, not just character count. That distinction matters when a table contains Chinese, Japanese, Korean, emoji, or Unicode box-drawing characters. A string can contain a small number of characters but occupy more columns in a terminal.

If a converter pads cells by counting code units instead of visible columns, the result will look uneven. Documentation authors do not need to know every Unicode rule, but a few practical habits help.

Character count is not display width

This table has short values:

| Area | Status |
|---|---|
| 文档 | ✅ Ready |
| API | ⚠️ Review |

The visible width of 文档 is usually wider than two ASCII letters. Emoji can also occupy more than one terminal column. A converter should account for that when aligning cells.

Why terminals differ

Terminals, editors, browsers, and chat tools may not agree perfectly about width. Font choice, operating system, emoji rendering, and East Asian width rules all play a role. That is why a table can look aligned in one place and slightly off in another.

Use these habits when the destination matters:

Content typeRiskPractical habit
CJK labelsWider than ASCIIKeep labels short
Emoji statusPlatform-dependent widthPair with text
Box drawingUsually stableTest in target terminal
Mixed scriptsHarder to scanAvoid crowded columns

The goal is not perfect control over every renderer. The goal is to avoid tables that are fragile before they are pasted.

Pair emoji with words

Emoji alone can be ambiguous:

| Service | Status |
|---|---|
| Docs | ✅ |
| Billing | ⚠️ |
| API | ❌ |

Prefer:

| Service | Status |
|---|---|
| Docs | ✅ Ready |
| Billing | ⚠️ Review |
| API | ❌ Blocked |

The text label keeps the meaning clear even if emoji display changes.

Keep multilingual tables narrow

When a table mixes English and CJK text, avoid many columns:

| Area | Owner | Status |
|---|---|---|
| 文档 | Lee | ✅ Ready |
| 支付 | Chen | ⚠️ Review |

This is usually manageable. A five-column version with long descriptions is much more likely to wrap. If you need multilingual descriptions, put them below the table.

Unicode box output and CJK

Unicode box drawing can pair nicely with CJK text in modern terminals:

┌──────┬──────────┐
│ Area │ Status   │
├──────┼──────────┤
│ 文档 │ ✅ Ready │
└──────┴──────────┘

For older tools, ASCII grid may be safer:

+------+----------+
| Area | Status   |
+------+----------+
| 文档 | ✅ Ready |
+------+----------+

Choose based on the destination. Modern terminal docs can use Unicode. Source comments and legacy systems are usually better with ASCII.

A simple testing workflow

Before sending a multilingual table:

  1. Convert the Markdown table.
  2. Check the maximum visible line width.
  3. Paste into the real destination, not only a browser preview.
  4. If columns drift, try ASCII or Simple text.
  5. If lines wrap, split the table or shorten cells.

CJK and emoji support should not prevent readable plain-text tables. It just requires treating visible width as a first-class part of the conversion.

Convert your own table

Paste a Markdown table into the converter and choose ASCII grid, Unicode box, or Simple text output. Conversion runs locally in your browser.

Convert a Markdown table