How to print two-digit Unicode chars, e.g. the EU flag?

single:

\u{1f1ea}\u{1f1fa}

many:

#eval("[\u{1f1ea}\u{1f1fa}]")  // with a loop

a long case (all Unicode flags):

#set text(size:18pt)

#let dec2hex(num) = {
	let digits = "0123456789abcdef"
	let hex = ""
	let rem = 0
	while true {
		rem = calc.rem(num, 16)
		hex = digits.at(rem) + hex
		num = calc.quo(num, 16)
		if num < 16 {
			hex = digits.at(num) + hex
			break}}
	return hex}
	
// unicode flags' letters: (127462, 127488)  // 1f1e6~1f1ff
#let unicode_flags() = {
	let r = range(127462, 127488).map(dec2hex)
	let m = ""
	let n = ""

	let v = ("[]",)
	for i in r {v.push("[\u{" + i + "}]")}  // header

	for m in r {v.push("[\u{" + m + "}]")  // leader

		for n in r {v.push("[\u{" + m + "}\u{" + n + "}]")}}
	
	return v}

#grid(columns:(1fr,)*27, row-gutter:0pt, ..unicode_flags().map(eval))

1 Like

Great idea! Hereโ€™s a variant that uses str.from-unicode.

#set page(height: auto, width: auto, margin: 15pt)
#set text(size: 18pt)

#let unicode-flags() = {
  // Unicode flags' letters
  let alphabet = range(0x1f1e6, 0x1f200)

  (
    // First row
    (
      [], // Top-left corner
      ..alphabet.map(n => str.from-unicode(n)), // Header
    ),
    ..alphabet.map(m => {
      // m-th row
      (
        str.from-unicode(m), // Leader
        ..alphabet.map(n => {
          (m, n).map(str.from-unicode).join()
        }),
      )
    }),
  )
}

#grid(
  columns: (2em,) * 27,
  column-gutter: 0.5em,
  row-gutter: 0.4em,
  ..unicode-flags().flatten()
)
1 Like