Web & HTML

Unicode in CSS

CSS supports Unicode via escape sequences (\2713 for ✓), the content property for generated text, unicode-range for font subsetting, and the writing-mode property for vertical text.

What is Unicode in CSS?

CSS has multiple mechanisms for working with Unicode characters: escape sequences for inserting characters by code point, the content property for generated text, unicode-range for selective font loading, and properties that control writing direction and script rendering. Understanding these tools is essential for building multilingual, internationalized web interfaces.

CSS Unicode Escape Sequences

CSS uses a backslash-based escape syntax to insert Unicode characters by code point. The format is \ followed by one to six hexadecimal digits, optionally followed by a space:

/* Checkmark ✓ (U+2713) in generated content */
.item::before {
  content: "\2713  ";
}

/* Copyright symbol © (U+00A9) */
.footer::after {
  content: "\A9 2024 My Company";
}

/* Emoji via code point (🌍 = U+1F30D) */
.global::before {
  content: "\1F30D";
}

The trailing space after the hex digits is required if the next character is also a valid hex digit, to prevent ambiguity. Modern CSS also accepts the notation \{1F30D} with curly braces in some contexts, but browser support for this form is uneven.

The content Property and Unicode

The CSS content property (valid on ::before and ::after pseudo-elements) accepts literal Unicode strings or escape sequences. You can mix them:

.required::after {
  content: " \2733";  /* ✳ */
  color: red;
}

@font-face unicode-range

The unicode-range descriptor inside @font-face tells the browser to download a font file only when the page contains characters in the specified range. This is the backbone of efficient multilingual font loading — it prevents loading a full Japanese font just because a page has one Japanese character.

@font-face {
  font-family: "MyFont";
  src: url("latin.woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153;
}

@font-face {
  font-family: "MyFont";
  src: url("japanese.woff2");
  unicode-range: U+3000-9FFF, U+F900-FAFF;
}

The browser matches code points in the document against the declared ranges and downloads only the relevant font files.

Writing Mode and Direction

CSS controls text flow direction through three core properties:

/* Horizontal top-to-bottom (default) */
.latin { writing-mode: horizontal-tb; }

/* Vertical right-to-left (Traditional Chinese, Japanese) */
.vertical-cjk { writing-mode: vertical-rl; }

/* Right-to-left base direction (Arabic, Hebrew) */
.arabic { direction: rtl; }

CSS Counters with Non-Latin Numerals

The list-style-type property and counter() function support dozens of non-Latin numeral systems:

ol { list-style-type: cjk-decimal; }      /* CJK numerals: 一, 二, 三 */
ol { list-style-type: arabic-indic; }     /* ١, ٢, ٣ */
ol { list-style-type: devanagari; }       /* १, २, ३ */

Quick Facts

Feature CSS Property / Syntax
Insert by code point content: "\2713" (1–6 hex digits)
Selective font loading @font-face { unicode-range: U+... }
Writing direction direction: rtl \| ltr
Vertical text writing-mode: vertical-rl \| vertical-lr
Non-Latin list numbers list-style-type: devanagari \| arabic-indic \| ...
Bidi control unicode-bidi: isolate \| embed \| override
Font rendering font-variant (OpenType feature access)

関連用語

Web & HTML のその他の用語

Content-Type 文字セット

レスポンスの文字エンコーディングを宣言するHTTPヘッダーパラメータ(Content-Type: text/html; charset=utf-8)。ドキュメント内のエンコーディング宣言より優先されます。

CSS content プロパティ

::beforeおよび::after疑似要素でUnicodeエスケープを使って生成コンテンツを挿入するCSSプロパティ:content: '\2713'は✓を挿入します。

CSS Text Direction

CSS properties (direction, writing-mode, unicode-bidi) controlling text layout direction. Works with Unicode …

HTML エンティティ

HTMLで文字をテキスト表現する方式。3つの形式:名前(&)・十進数(&)・16進数(&)。HTMLの構文と衝突する文字に必須です。

JavaScript Intl API

ECMAScript Internationalization API providing locale-aware string comparison (Collator), number formatting (NumberFormat), date …

Punycode

Unicode ドメイン名をxn--プレフィックス付きのASCII文字列に変換するASCII互換エンコーディング。münchen.de → xn--mnchen-3ya.de。

XML 文字参照

XMLバージョンの数値文字参照:✓または✓。XMLには名前付きエンティティが5個(& < > " ')しかありませんが、HTML5は2,231個あります。

テキスト表示

デフォルトの絵文字表示の代わりに、通常は異体字セレクター15(U+FE0E)を使って文字をモノクロのテキストグリフでレンダリングすること。

パーセントエンコーディング (URL エンコーディング)

URLの非ASCII文字と予約文字を各バイトを%XXで置き換えてエンコードします。まずUTF-8に変換し、各バイトをパーセントエンコードします:é → %C3%A9。

ワードジョイナー

U+2060。改行を防ぐゼロ幅文字。ゼロ幅ノーブレークスペースとしてのU+FEFF(BOM)の現代的な代替です。