プログラミングと開発

Unicode エスケープシーケンス

ソースコードでUnicode文字を表す構文。言語によって異なります:\u2713(Python/Java/JS)・\u{2713}(JS/Ruby/Rust)・\U00012345(Python/C)。

· Updated

What Are Unicode Escape Sequences?

Unicode escape sequences are a notation for representing Unicode characters in source code using only ASCII characters. Instead of embedding the actual character (which may not be typeable or visible), you write a backslash-based sequence that the language parser converts to the character at compile or parse time.

The exact syntax varies by language, but two forms dominate:

  • \uXXXX: Four hex digits — covers the Basic Multilingual Plane (U+0000–U+FFFF).
  • \UXXXXXXXX: Eight hex digits — covers all Unicode including supplementary planes (U+0000–U+10FFFF).

Language-by-Language Syntax

# Python
"\u00A9"        # © (U+00A9, 4-digit BMP)
"\U0001F600"    # 😀 (U+1F600, 8-digit supplementary)
"\N{SNOWMAN}"   # ☃ (named character)
"\x00A9"        # © (also valid: 2-digit hex byte)

# All identical:
"\u00A9" == "\U000000A9" == "©"  # True
// JavaScript
"\u00A9"          // © (BMP)
"\u{1F600}"       // 😀 (ES6+ brace notation, any code point)
"\uD83D\uDE00"    // 😀 (legacy: surrogate pair for supplementary)

// ES6 brace notation is recommended:
"\u{1F1FA}\u{1F1F8}"  // 🇺🇸 (flag sequence)
// Java — only \uXXXX (BMP), surrogates needed for supplementary
"\u00A9"            // ©
"\uD83D\uDE00"      // 😀 (surrogate pair)
// Java has no \U syntax — use char literals or Character.toChars()
// C#
"\u00A9"            // ©
"\U0001F600"        // 😀
"\x00A9"            // ©
// Rust
"\u{A9}"            // © (brace notation, variable length)
"\u{1F600}"         // 😀
// Go
"\u00A9"            // © (rune literal, BMP)
"\U0001F600"        // 😀 (rune literal, supplementary)

Java's Unusual Preprocessing

Java processes \uXXXX escapes during lexical preprocessing — before the tokenizer runs. This means a Unicode escape can appear in virtually any context including comments and string literals:

// The following comment contains a \u000A which is a newline!
// This will compile and affect the next line
int x = 1; // \u000A x = 2;

// Effectively parsed as:
// int x = 1;
// x = 2;

This is a subtle Java gotcha: Unicode escapes in comments can inject real source code.

Using Escapes in Practice

# When to use escapes:
# 1. In code that must be ASCII-safe
ARROW = "\u2192"          # → RIGHT ARROW

# 2. For control characters
NULL = "\u0000"           # NUL
LINE_SEP = "\u2028"       # LINE SEPARATOR

# 3. For documentation clarity
ZWJ = "\u200D"            # Zero Width Joiner — invisible in source
NBSP = "\u00A0"           # Non-Breaking Space — invisible in source

# Named escapes (Python only) — most readable
import unicodedata
"\N{COPYRIGHT SIGN}"      # ©
"\N{ZERO WIDTH JOINER}"   # (ZWJ)
// ES6+ template literals with escapes
const message = `Copyright \u{A9} 2024 \u{2014} All rights reserved`;
// "Copyright © 2024 — All rights reserved"

Escape vs. Direct Character

In UTF-8 source files, direct characters are generally preferred for readability:

# Readable — direct character
emoji = "😀"

# ASCII-safe — escape (useful in legacy systems)
emoji = "\U0001F600"

# Both produce identical runtime values
"😀" == "\U0001F600"  # True

Quick Facts

Language BMP syntax Full range syntax
Python \uXXXX \UXXXXXXXX or \N{name}
JavaScript \uXXXX \u{XXXXX} (ES6+)
Java \uXXXX Surrogate pairs only
C# \uXXXX \UXXXXXXXX
Rust \u{X} to \u{XXXXXX} Same (variable length)
Go \uXXXX \UXXXXXXXX
CSS \XXXXXX Same (1–6 hex digits)

プログラミングと開発 のその他の用語

Java Unicode

Java strings use UTF-16 internally. char is 16-bit (only BMP). For supplementary …

Python Unicode

Python 3 uses Unicode strings by default (str = UTF-8 internally via …

Rust Unicode

Rust strings (str/String) are guaranteed valid UTF-8. char type represents a Unicode …

Unicode 正規表現

Unicodeプロパティを使う正規表現パターン:\p{L}(任意の文字)・\p{Script=Greek}(ギリシャ語スクリプト)・\p{Emoji}。言語や正規表現エンジンによってサポートが異なります。

エンコーディング / デコーディング

エンコーディングは文字をバイトに変換し(str.encode('utf-8'))、デコーディングはバイトを文字に変換します(bytes.decode('utf-8'))。正しく行えば文字化けを防げます。

サロゲートペア

UTF-16で補助文字をエンコードするために使われる2つの16ビットコード単位(上位サロゲートU+D800〜U+DBFF + 下位サロゲートU+DC00〜U+DFFF)。😀 = D83D DE00。

ヌル文字

U+0000(NUL)。最初のUnicode/ASCII文字で、C/C++では文字列ターミネータとして使われます。セキュリティリスク:ヌルバイト挿入は脆弱なシステムで文字列を切り捨てる可能性があります。

不可視文字

目に見えるグリフを持たない文字:空白・ゼロ幅文字・制御文字・書式文字。スプーフィングやテキスト密輸などのセキュリティ問題を引き起こす可能性があります。

文字列

プログラミング言語における文字のシーケンス。内部表現はさまざまです:UTF-8(Go・Rust・新しいPython)・UTF-16(Java・JavaScript・C#)・UTF-32(Python)。

文字列長の曖昧さ

Unicodeの文字列の「長さ」は単位によって異なります:コード単位(JavaScript .length)・コードポイント(Python len())・書記素クラスター。👨‍👩‍👧‍👦 = 7コードポイント、1書記素。