Pemrograman & Pengembangan

Urutan escape Unicode

Sintaks untuk merepresentasikan karakter Unicode dalam kode sumber. Bervariasi per bahasa: \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)

Lainnya di Pemrograman & Pengembangan