Technical Reports |
Version | 1 |
Editors | Mark Davis |
Date | 2024-10-17 |
This Version | https://www.unicode.org/reports/tr58/tr58-1.html |
Previous Version | none |
Latest Version | https://www.unicode.org/reports/tr58/ |
Latest Proposed Update | https://www.unicode.org/reports/tr58/proposed.html |
Revision | 24 |
This document specifies a mechanism for performing linkification of URLs containing non-ASCII characters in plain text. It also provides a corresponding mechanism for determining when to escape non-ASCII code points.
This is a draft document which may be updated, replaced, or superseded by other documents at any time. Publication does not imply endorsement by the Unicode Consortium. This is not a stable document; it is inappropriate to cite this document as other than a work in progress.
A Unicode Technical Standard (UTS) is an independent specification. Conformance to the Unicode Standard does not imply conformance to any UTS.
Please submit corrigenda and other comments with the online reporting form [Feedback]. Related information that is useful in understanding this document is found in the References. For more information see About Unicode Technical Reports and the Specifications FAQ. Unicode Technical Reports are governed by the Unicode Terms of Use.
[Review Note: TBD update to latest sections.]
With most email programs, when someone pastes in the plain text:
and sends to someone else, they receive it as:
The process of determining the boundaries of the link in plain text is called linkification or link detection.
That is, linkification is the process of determining when a text substring represents a URL. That substring can then have a link applied to it. The specifications for a URL don’t specify how to handle linkification, since they are only concerned with the structure in isolation, not when it is embedded within flowing text.
Notes
- Following WhatWG URL: Goals, this specification uses the term URL broadly, as including unescaped non-ASCII characters; that is, as utilizing the formal definition of IRIs. See also the W3C's An Introduction to Multilingual Web Addresses.
- In examples, links will be shown with a background color, to make the extent of the linkification clear.
[Review Note: The link examples need to be improved to make the segment of text that is linkified more visible.]
The linkification process for URLs is already fragmented — with different implementations producing very different results — but it is amplified with the addition of non-ASCII characters, which often have very different behavior. That is, developers’ lack of familiarity with the behavior of non-ASCII characters has caused the different implementations of linkification to splinter. Yet non-ASCII characters are very important for readability. People do not want to see the above IRI expressed in escaped ASCII:
For example, take the lists of links on List of articles every Wikipedia should have in the available languages. When those are tested with major products, there are significant differences: any two implementations are likely to linkify those differently, such as terminating the linkification at different places, or not linkifying at all. That makes it very difficult to exchange URLs between products within plaintext, which is done surprisingly often — definitely causing problems for implementations that need predictable behavior.
This inconsistency causes problems for users and software companies. Having consistent rules for linkification also has additional benefits, leading to solutions for the following reported problems:
If linkification behavior becomes more predictable across platforms and applications, applications will be able to do minimal escaping. For example, in the following only one character would need escaping, the %29 — representing an unmatched ")":
Providing a consistent, predictable solution that works well across the world’s languages requires a standardized algorithm to define the behavior, and the corresponding Unicode character properties assigned to all Unicode characters.
UTS58-C1. For a given version of Unicode, a conformant implementation shall replicate the same linkification results as those produced by Section 3, Algorithm.
The following table shows the relevant parts of a URL. For clarity, the separator characters are included in the examples. For more information see WhatWG's URL: Example URL Components .
Protocol | Host (incl. Domain) | Port | Path | Query | Fragment |
---|---|---|---|---|---|
https:// | docs.foobar.com | :8000 | /knowledge/area/ | ?name=article&topic=seo | #top |
Note that the Port, Path, Query, and Fragment are each optional.
There are two main processes involved in Unicode linkification.
The start of a URL is easy to determine when it has a known protocol (eg, "https://").
Implementations have also developed heuristics for determining the start of the URL when the protocol is elided, taking advantage of the fact that there are relatively few top-level domains. And those techniques can be easily applied to internationalized domain names, which still have strong limitations on the valid characters. So the end of the domain name is also relatively easy to determine. For more information, see Unicode IDNA Compatibility Processing
The parsing up to the path, query, or fragment is as specified in WhatWG URL: 4.4. URL parsing.
For example, implementations must terminate linkification if a forbidden host code point is encountered, or if the host is a domain and a forbidden domain code point is encountered. Implementations must not linkify if a domain is not a registrable domain. The terms forbidden host code point, forbidden domain code point, and registrable domain are defined in WhatWG URL: Host representation.
For example, an implementation would parse to the end of microsoft.com and google.de, foo.рф, or xn--j1ay.xn--p1ai.
Termination is much more challenging, because of the presence of Unicode characters. While small, hard-coded sets of characters suffice for an ASCII implementation, there are over 150,000 Unicode characters, many with quite different behavior than ASCII. While in theory, almost any Unicode character can occur in certain fields in an URL, in practice many characters have very restricted usage in URLs.
Initiation stops at any Path, Query, or Fragment, so the termination process takes over with a "/", "?", or "#" character. Each Path, Query, or Fragment can contain most Unicode characters. The key is to be able to determine, given a Part (such as a Query), when a sequence of characters should cause termination of the linkification, even though that character would be valid in the URL specification.
It is impossible for a linkification algorithm to match user expectations in all circumstances, given the variation in usage of various characters both within and across languages. So the goal is to cover use cases as broadly as possible, recognizing that it will sometimes not match user expectations in certain cases. Exceptional cases (URLs that need to use characters that would terminate) can still be appropriately linkified if those few characters are represented with % escapes.
At a high level, this specification defines three features:
One of the goals is also predictability; it should be relatively easy for users to understand the linkification behavior at a high level.
This specification defines two properties: LinkTermination (LT) and LinkPairedOpeners (LPO).
LinkTermination is an enumerated property of characters with five enumerated values: {none, hard, soft, closing, opening}
Value | Description / Examples |
---|---|
none | There is no stop before the character; it is included in the link. |
Example: letters | |
hard | The URL terminates before this character. |
Example: a space
|
|
soft | The URL terminates before this
character, if it is followed by /\p{lt=soft}*(\p{lt=hard}|\p{lt=endOfText})/
|
Example: a question mark | |
closing | If the character is paired with a previous character in the same part (path, query, fragment), it is treated as none. Otherwise it is treated as hard. |
Example: an end parenthesis | |
opening | Used to match closing characters. |
Example: same as under closing |
LinkPairedOpeners is a string property of characters, which for each character in \p{LinkTermination=closing}, returns a character with \p{LinkTermination=opening}.
Example
The specification of the characters with each of these property values is given in Property Assignments.
The termination algorithm assumes that a domain (or other host) has been successfully parsed to the start of a Path, Query, or Fragment, as per the algorithm in WhatWG URL: 3. Hosts (domains and IP addresses) .
This algorithm then processes each final part [path, query, fragment] of the URL in turn. It stops when it encounters a code point that meets one of the terminating conditions and reports the last location in the current part that is still safely considered part of the link. The common terminating conditions are based on the LinkTermination and LinkPairedOpener properties:
LinkTermination=hard
character, such as a space.
Within a Path, "?" and "#" are handled as hard
. Within
a Query, "#" is handled as hard
.
LinkTermination=soft
character, such as a ?
that is followed by a sequence of zero or more soft
characters, then either a hard
character or the end of
the text.
LinkTermination=closing
character, such as a
] that does not have a matching opening
character in the same part of the URL. The matching process
uses the LinkPairedOpener property to determine the correct opening
character, and matches against the top element of a stack of opening
characters.
More formally:
Process each of the parts [path, query, fragment] as follows, where cp[i] refers to the ith code point in the part, and where i is from 0 to n-1.
This can be optimized in various ways, of course.
hard
within a Path and "#" within a Query.]
The property assignments are derived according to the following descriptions.
Whitespace, controls, unassigned,...
Termination characters and quotation marks:
The contents of the second bullet are expanded in the following table:
Char. | Code Point | Name |
---|---|---|
" | U+0022 |
QUOTATION MARK |
' | U+0027 |
APOSTROPHE |
« | U+00AB |
LEFT-POINTING DOUBLE ANGLE QUOTATION MARK |
» | U+00BB |
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK |
‘ | U+2018 |
LEFT SINGLE QUOTATION MARK |
’ | U+2019 |
RIGHT SINGLE QUOTATION MARK |
‚ | U+201A |
SINGLE LOW-9 QUOTATION MARK |
‛ | U+201B |
SINGLE HIGH-REVERSED-9 QUOTATION MARK |
“ | U+201C |
LEFT DOUBLE QUOTATION MARK |
” | U+201D |
RIGHT DOUBLE QUOTATION MARK |
„ | U+201E |
DOUBLE LOW-9 QUOTATION MARK |
‟ | U+201F |
DOUBLE HIGH-REVERSED-9 QUOTATION MARK |
‹ | U+2039 |
SINGLE LEFT-POINTING ANGLE QUOTATION MARK |
› | U+203A |
SINGLE RIGHT-POINTING ANGLE QUOTATION MARK |
Derived from LinkPairedOpeners property
All other code points
if BidiPairedBracketType(cp) != Open
then LinkPairedOpeners(cp) == \x{0}
else LinkPairedOpeners(cp) == BidPairedBracket(cp)
The linkification algorithm can be used to generate a corresponding minimal escaping. Given the URL in unescaped string form, perform linkification on it. If the process stops before the end of the string, percent-escape the next character and continue.
Additional characters can be escaped to reduce confusability, especially when they are confusable with URL syntax characters, such as a Ɂ character in a path. For security implications of IRIs, see UTS #39: Unicode Security Mechanisms. For related issues, see UTS #55 Unicode Source Code Handling.
For display of BIDI IRIs, see also HL4 in UAX #9, Unicode Bidirectional Algorithm
For scripts that don’t need spaces between words, it is a bit tricky to linkify within sentences. For example, take:
The URL is set off from the rest of the text. But then look at in the equivalent Japanese sentence:
That would not maintain a separation between the text if simply substituted for x in a phrase like “xは重要なページです” — so the linkification would go too far. One would need some kind of separator character to separate the text. That can be done with Hard characters (eg, space):
Or with closing characters, such as:
One could consider modifying the algorithm to provide for a termination between non-spacing scripts and spacing scripts. That wouldn’t help with the above examples, but would help with cases like:
However, that would complicate the behavior for little overall benefit.
One might consider adding quotation marks to opening/closing, but that would make the algorithm much more complicated. The problem is that the pairings are not 1:1 in natural languages. Examples:
Open(s) | Close | ||
---|---|---|---|
" | " | ||
„ | “ | ||
“ | ” | „ | ” |
‹ | › | ||
› | ‹ | ||
« | » | ||
» | « |
There is a further complication, that some quotation marks appear in non-paired usage, such as RIGHT SINGLE QUOTATION MARK or APOSTROPHE, but also QUOTATION MARK as an alternative to HEBREW PUNCTUATION GERSHAYIM. The simplest and most predictable solution is to have them be Soft.
The following lists the draft assignment of LinkTermination and LinkPairedOpeners property values.
Note that Format characters (\p{Cf})
in particular will need careful review — for clarity many of those
characters should probably be
hard
, that is, require escaping in plain text. Some of them may require
more context, such as allowing a sequence of unescaped TAG characters
to be included in the linkification only when immediately after an
emoji character.
# LinkTermination=None # (All code points without other values) # LinkTermination=Hard # draft = [[\p{whitespace}\p{NChar}\p{C}]-\p{Cf}] # (not listing Unassigned or Surrogates) 0000..0000; Hard # (Cc) <control-0000>..(Cc) SPACE 007F..007F; Hard # (Cc) <control-007F>..(Cc) NO-BREAK SPACE 1680; Hard # (Zs) OGHAM SPACE MARK 2000..2000; Hard # (Zs) EN QUAD..(Zs) HAIR SPACE 2028..2028; Hard # (Zl) LINE SEPARATOR..(Zl) PARAGRAPH SEPARATOR 202F; Hard # (Zs) NARROW NO-BREAK SPACE 205F; Hard # (Zs) MEDIUM MATHEMATICAL SPACE 3000; Hard # (Zs) IDEOGRAPHIC SPACE E000..E000; Hard # (Co) <private use area-E000>..(Co) <private use area-F8FF> F0000..F0000; Hard # (Co) <private use area-F0000>..(Co) <private use area-FFFFD> 100000..100000; Hard # (Co) <private use area-100000>..(Co) <private use area-10FFFD> # LinkTermination=Soft # draft = [\p{Term}["'\u00AB\u00BB\u2018-\u201F\u2039\u203A]] 0021..0021; Soft # (Po) EXCLAMATION MARK..(Po) QUOTATION MARK 0027; Soft # (Po) APOSTROPHE 002C; Soft # (Po) COMMA 002E; Soft # (Po) FULL STOP 003A..003A; Soft # (Po) COLON..(Po) SEMICOLON 003F; Soft # (Po) QUESTION MARK 00AB; Soft # (Pi) LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 00BB; Soft # (Pf) RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 037E; Soft # (Po) GREEK QUESTION MARK 0387; Soft # (Po) GREEK ANO TELEIA 0589; Soft # (Po) ARMENIAN FULL STOP 05C3; Soft # (Po) HEBREW PUNCTUATION SOF PASUQ 060C; Soft # (Po) ARABIC COMMA 061B; Soft # (Po) ARABIC SEMICOLON 061D..061D; Soft # (Po) ARABIC END OF TEXT MARK..(Po) ARABIC QUESTION MARK 06D4; Soft # (Po) ARABIC FULL STOP 0700..0700; Soft # (Po) SYRIAC END OF PARAGRAPH..(Po) SYRIAC CONTRACTION 070C; Soft # (Po) SYRIAC HARKLEAN METOBELUS 07F8..07F8; Soft # (Po) NKO COMMA..(Po) NKO EXCLAMATION MARK 0830..0830; Soft # (Po) SAMARITAN PUNCTUATION NEQUDAA..(Po) SAMARITAN PUNCTUATION SHIYYAALAA 0837..0837; Soft # (Po) SAMARITAN PUNCTUATION MELODIC QITSA..(Po) SAMARITAN PUNCTUATION ANNAAU 085E; Soft # (Po) MANDAIC PUNCTUATION 0964..0964; Soft # (Po) DEVANAGARI DANDA..(Po) DEVANAGARI DOUBLE DANDA 0E5A..0E5A; Soft # (Po) THAI CHARACTER ANGKHANKHU..(Po) THAI CHARACTER KHOMUT 0F08; Soft # (Po) TIBETAN MARK SBRUL SHAD 0F0D..0F0D; Soft # (Po) TIBETAN MARK SHAD..(Po) TIBETAN MARK RGYA GRAM SHAD 104A..104A; Soft # (Po) MYANMAR SIGN LITTLE SECTION..(Po) MYANMAR SIGN SECTION 1361..1361; Soft # (Po) ETHIOPIC WORDSPACE..(Po) ETHIOPIC PARAGRAPH SEPARATOR 166E; Soft # (Po) CANADIAN SYLLABICS FULL STOP 16EB..16EB; Soft # (Po) RUNIC SINGLE PUNCTUATION..(Po) RUNIC CROSS PUNCTUATION 1735..1735; Soft # (Po) PHILIPPINE SINGLE PUNCTUATION..(Po) PHILIPPINE DOUBLE PUNCTUATION 17D4..17D4; Soft # (Po) KHMER SIGN KHAN..(Po) KHMER SIGN CAMNUC PII KUUH 17DA; Soft # (Po) KHMER SIGN KOOMUUT 1802..1802; Soft # (Po) MONGOLIAN COMMA..(Po) MONGOLIAN FOUR DOTS 1808..1808; Soft # (Po) MONGOLIAN MANCHU COMMA..(Po) MONGOLIAN MANCHU FULL STOP 1944..1944; Soft # (Po) LIMBU EXCLAMATION MARK..(Po) LIMBU QUESTION MARK 1AA8..1AA8; Soft # (Po) TAI THAM SIGN KAAN..(Po) TAI THAM SIGN SATKAANKUU 1B4E..1B4E; Soft # (Po) BALINESE INVERTED CARIK SIKI..(Po) BALINESE INVERTED CARIK PAREREN 1B5A..1B5A; Soft # (Po) BALINESE PANTI..(Po) BALINESE PAMADA 1B5D..1B5D; Soft # (Po) BALINESE CARIK PAMUNGKAH..(Po) BALINESE CARIK PAREREN 1B7D..1B7D; Soft # (Po) BALINESE PANTI LANTANG..(Po) BALINESE PANTI BAWAK 1C3B..1C3B; Soft # (Po) LEPCHA PUNCTUATION TA-ROL..(Po) LEPCHA PUNCTUATION TSHOOK 1C7E..1C7E; Soft # (Po) OL CHIKI PUNCTUATION MUCAAD..(Po) OL CHIKI PUNCTUATION DOUBLE MUCAAD 2018..2018; Soft # (Pi) LEFT SINGLE QUOTATION MARK..(Pi) DOUBLE HIGH-REVERSED-9 QUOTATION MARK 2024; Soft # (Po) ONE DOT LEADER 2039..2039; Soft # (Pi) SINGLE LEFT-POINTING ANGLE QUOTATION MARK..(Pi) SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 203C..203C; Soft # (Po) DOUBLE EXCLAMATION MARK..(Po) INTERROBANG 2047..2047; Soft # (Po) DOUBLE QUESTION MARK..(Po) EXCLAMATION QUESTION MARK 2CF9..2CF9; Soft # (Po) COPTIC OLD NUBIAN FULL STOP..(Po) COPTIC OLD NUBIAN INDIRECT QUESTION MARK 2E2E; Soft # (Po) REVERSED QUESTION MARK 2E3C; Soft # (Po) STENOGRAPHIC FULL STOP 2E41; Soft # (Po) REVERSED COMMA 2E4C; Soft # (Po) MEDIEVAL COMMA 2E4E..2E4E; Soft # (Po) PUNCTUS ELEVATUS MARK..(Po) CORNISH VERSE DIVIDER 2E53..2E53; Soft # (Po) MEDIEVAL EXCLAMATION MARK..(Po) MEDIEVAL QUESTION MARK 3001..3001; Soft # (Po) IDEOGRAPHIC COMMA..(Po) IDEOGRAPHIC FULL STOP A4FE..A4FE; Soft # (Po) LISU PUNCTUATION COMMA..(Po) LISU PUNCTUATION FULL STOP A60D..A60D; Soft # (Po) VAI COMMA..(Po) VAI QUESTION MARK A6F3..A6F3; Soft # (Po) BAMUM FULL STOP..(Po) BAMUM QUESTION MARK A876..A876; Soft # (Po) PHAGS-PA MARK SHAD..(Po) PHAGS-PA MARK DOUBLE SHAD A8CE..A8CE; Soft # (Po) SAURASHTRA DANDA..(Po) SAURASHTRA DOUBLE DANDA A92F; Soft # (Po) KAYAH LI SIGN SHYA A9C7..A9C7; Soft # (Po) JAVANESE PADA PANGKAT..(Po) JAVANESE PADA LUNGSI AA5D..AA5D; Soft # (Po) CHAM PUNCTUATION DANDA..(Po) CHAM PUNCTUATION TRIPLE DANDA AADF; Soft # (Po) TAI VIET SYMBOL KOI KOI AAF0..AAF0; Soft # (Po) MEETEI MAYEK CHEIKHAN..(Po) MEETEI MAYEK AHANG KHUDAM ABEB; Soft # (Po) MEETEI MAYEK CHEIKHEI FE12; Soft # (Po) PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP FE15..FE15; Soft # (Po) PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK..(Po) PRESENTATION FORM FOR VERTICAL QUESTION MARK FE50..FE50; Soft # (Po) SMALL COMMA..(Po) SMALL FULL STOP FE54..FE54; Soft # (Po) SMALL SEMICOLON..(Po) SMALL EXCLAMATION MARK FF01; Soft # (Po) FULLWIDTH EXCLAMATION MARK FF0C; Soft # (Po) FULLWIDTH COMMA FF0E; Soft # (Po) FULLWIDTH FULL STOP FF1A..FF1A; Soft # (Po) FULLWIDTH COLON..(Po) FULLWIDTH SEMICOLON FF1F; Soft # (Po) FULLWIDTH QUESTION MARK FF61; Soft # (Po) HALFWIDTH IDEOGRAPHIC FULL STOP FF64; Soft # (Po) HALFWIDTH IDEOGRAPHIC COMMA 1039F; Soft # (Po) UGARITIC WORD DIVIDER 103D0; Soft # (Po) OLD PERSIAN WORD DIVIDER 10857; Soft # (Po) IMPERIAL ARAMAIC SECTION SIGN 1091F; Soft # (Po) PHOENICIAN WORD SEPARATOR 10A56..10A56; Soft # (Po) KHAROSHTHI PUNCTUATION DANDA..(Po) KHAROSHTHI PUNCTUATION DOUBLE DANDA 10AF0..10AF0; Soft # (Po) MANICHAEAN PUNCTUATION STAR..(Po) MANICHAEAN PUNCTUATION TWO DOTS 10B3A..10B3A; Soft # (Po) TINY TWO DOTS OVER ONE DOT PUNCTUATION..(Po) LARGE ONE RING OVER TWO RINGS PUNCTUATION 10B99..10B99; Soft # (Po) PSALTER PAHLAVI SECTION MARK..(Po) PSALTER PAHLAVI FOUR DOTS WITH DOT 10F55..10F55; Soft # (Po) SOGDIAN PUNCTUATION TWO VERTICAL BARS..(Po) SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT 10F86..10F86; Soft # (Po) OLD UYGHUR PUNCTUATION BAR..(Po) OLD UYGHUR PUNCTUATION FOUR DOTS 11047..11047; Soft # (Po) BRAHMI DANDA..(Po) BRAHMI PUNCTUATION LOTUS 110BE..110BE; Soft # (Po) KAITHI SECTION MARK..(Po) KAITHI DOUBLE DANDA 11141..11141; Soft # (Po) CHAKMA DANDA..(Po) CHAKMA QUESTION MARK 111C5..111C5; Soft # (Po) SHARADA DANDA..(Po) SHARADA DOUBLE DANDA 111CD; Soft # (Po) SHARADA SUTRA MARK 111DE..111DE; Soft # (Po) SHARADA SECTION MARK-1..(Po) SHARADA SECTION MARK-2 11238..11238; Soft # (Po) KHOJKI DANDA..(Po) KHOJKI DOUBLE SECTION MARK 112A9; Soft # (Po) MULTANI SECTION MARK 113D4..113D4; Soft # (Po) TULU-TIGALARI DANDA..(Po) TULU-TIGALARI DOUBLE DANDA 1144B..1144B; Soft # (Po) NEWA DANDA..(Po) NEWA COMMA 1145A..1145A; Soft # (Po) NEWA DOUBLE COMMA..(Po) NEWA PLACEHOLDER MARK 115C2..115C2; Soft # (Po) SIDDHAM DANDA..(Po) SIDDHAM SEPARATOR BAR 115C9..115C9; Soft # (Po) SIDDHAM END OF TEXT MARK..(Po) SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES 11641..11641; Soft # (Po) MODI DANDA..(Po) MODI DOUBLE DANDA 1173C..1173C; Soft # (Po) AHOM SIGN SMALL SECTION..(Po) AHOM SIGN RULAI 11944; Soft # (Po) DIVES AKURU DOUBLE DANDA 11946; Soft # (Po) DIVES AKURU END OF TEXT MARK 11A42..11A42; Soft # (Po) ZANABAZAR SQUARE MARK SHAD..(Po) ZANABAZAR SQUARE MARK DOUBLE SHAD 11A9B..11A9B; Soft # (Po) SOYOMBO MARK SHAD..(Po) SOYOMBO MARK DOUBLE SHAD 11AA1..11AA1; Soft # (Po) SOYOMBO TERMINAL MARK-1..(Po) SOYOMBO TERMINAL MARK-2 11C41..11C41; Soft # (Po) BHAIKSUKI DANDA..(Po) BHAIKSUKI WORD SEPARATOR 11C71; Soft # (Po) MARCHEN MARK SHAD 11EF7..11EF7; Soft # (Po) MAKASAR PASSIMBANG..(Po) MAKASAR END OF SECTION 11F43..11F43; Soft # (Po) KAWI DANDA..(Po) KAWI DOUBLE DANDA 12470..12470; Soft # (Po) CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..(Po) CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON 16A6E..16A6E; Soft # (Po) MRO DANDA..(Po) MRO DOUBLE DANDA 16AF5; Soft # (Po) BASSA VAH FULL STOP 16B37..16B37; Soft # (Po) PAHAWH HMONG SIGN VOS THOM..(Po) PAHAWH HMONG SIGN CIM CHEEM 16B44; Soft # (Po) PAHAWH HMONG SIGN XAUS 16D6E..16D6E; Soft # (Po) KIRAT RAI DANDA..(Po) KIRAT RAI DOUBLE DANDA 16E97..16E97; Soft # (Po) MEDEFAIDRIN COMMA..(Po) MEDEFAIDRIN FULL STOP 1BC9F; Soft # (Po) DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA87..1DA87; Soft # (Po) SIGNWRITING COMMA..(Po) SIGNWRITING COLON # LinkTermination=Closing # draft = \p{Bidi_Paired_Bracket_Type=Close} 0029; Closing # (Pe) RIGHT PARENTHESIS 005D; Closing # (Pe) RIGHT SQUARE BRACKET 007D; Closing # (Pe) RIGHT CURLY BRACKET 0F3B; Closing # (Pe) TIBETAN MARK GUG RTAGS GYAS 0F3D; Closing # (Pe) TIBETAN MARK ANG KHANG GYAS 169C; Closing # (Pe) OGHAM REVERSED FEATHER MARK 2046; Closing # (Pe) RIGHT SQUARE BRACKET WITH QUILL 207E; Closing # (Pe) SUPERSCRIPT RIGHT PARENTHESIS 208E; Closing # (Pe) SUBSCRIPT RIGHT PARENTHESIS 2309; Closing # (Pe) RIGHT CEILING 230B; Closing # (Pe) RIGHT FLOOR 232A; Closing # (Pe) RIGHT-POINTING ANGLE BRACKET 2769; Closing # (Pe) MEDIUM RIGHT PARENTHESIS ORNAMENT 276B; Closing # (Pe) MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT 276D; Closing # (Pe) MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT 276F; Closing # (Pe) HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT 2771; Closing # (Pe) HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT 2773; Closing # (Pe) LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT 2775; Closing # (Pe) MEDIUM RIGHT CURLY BRACKET ORNAMENT 27C6; Closing # (Pe) RIGHT S-SHAPED BAG DELIMITER 27E7; Closing # (Pe) MATHEMATICAL RIGHT WHITE SQUARE BRACKET 27E9; Closing # (Pe) MATHEMATICAL RIGHT ANGLE BRACKET 27EB; Closing # (Pe) MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET 27ED; Closing # (Pe) MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET 27EF; Closing # (Pe) MATHEMATICAL RIGHT FLATTENED PARENTHESIS 2984; Closing # (Pe) RIGHT WHITE CURLY BRACKET 2986; Closing # (Pe) RIGHT WHITE PARENTHESIS 2988; Closing # (Pe) Z NOTATION RIGHT IMAGE BRACKET 298A; Closing # (Pe) Z NOTATION RIGHT BINDING BRACKET 298C; Closing # (Pe) RIGHT SQUARE BRACKET WITH UNDERBAR 298E; Closing # (Pe) RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 2990; Closing # (Pe) RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER 2992; Closing # (Pe) RIGHT ANGLE BRACKET WITH DOT 2994; Closing # (Pe) RIGHT ARC GREATER-THAN BRACKET 2996; Closing # (Pe) DOUBLE RIGHT ARC LESS-THAN BRACKET 2998; Closing # (Pe) RIGHT BLACK TORTOISE SHELL BRACKET 29D9; Closing # (Pe) RIGHT WIGGLY FENCE 29DB; Closing # (Pe) RIGHT DOUBLE WIGGLY FENCE 29FD; Closing # (Pe) RIGHT-POINTING CURVED ANGLE BRACKET 2E23; Closing # (Pe) TOP RIGHT HALF BRACKET 2E25; Closing # (Pe) BOTTOM RIGHT HALF BRACKET 2E27; Closing # (Pe) RIGHT SIDEWAYS U BRACKET 2E29; Closing # (Pe) RIGHT DOUBLE PARENTHESIS 2E56; Closing # (Pe) RIGHT SQUARE BRACKET WITH STROKE 2E58; Closing # (Pe) RIGHT SQUARE BRACKET WITH DOUBLE STROKE 2E5A; Closing # (Pe) TOP HALF RIGHT PARENTHESIS 2E5C; Closing # (Pe) BOTTOM HALF RIGHT PARENTHESIS 3009; Closing # (Pe) RIGHT ANGLE BRACKET 300B; Closing # (Pe) RIGHT DOUBLE ANGLE BRACKET 300D; Closing # (Pe) RIGHT CORNER BRACKET 300F; Closing # (Pe) RIGHT WHITE CORNER BRACKET 3011; Closing # (Pe) RIGHT BLACK LENTICULAR BRACKET 3015; Closing # (Pe) RIGHT TORTOISE SHELL BRACKET 3017; Closing # (Pe) RIGHT WHITE LENTICULAR BRACKET 3019; Closing # (Pe) RIGHT WHITE TORTOISE SHELL BRACKET 301B; Closing # (Pe) RIGHT WHITE SQUARE BRACKET FE5A; Closing # (Pe) SMALL RIGHT PARENTHESIS FE5C; Closing # (Pe) SMALL RIGHT CURLY BRACKET FE5E; Closing # (Pe) SMALL RIGHT TORTOISE SHELL BRACKET FF09; Closing # (Pe) FULLWIDTH RIGHT PARENTHESIS FF3D; Closing # (Pe) FULLWIDTH RIGHT SQUARE BRACKET FF5D; Closing # (Pe) FULLWIDTH RIGHT CURLY BRACKET FF60; Closing # (Pe) FULLWIDTH RIGHT WHITE PARENTHESIS FF63; Closing # (Pe) HALFWIDTH RIGHT CORNER BRACKET # LinkTermination=Opening # draft = \p{Bidi_Paired_Bracket_Type=Open} 0028; Opening # (Ps) LEFT PARENTHESIS 005B; Opening # (Ps) LEFT SQUARE BRACKET 007B; Opening # (Ps) LEFT CURLY BRACKET 0F3A; Opening # (Ps) TIBETAN MARK GUG RTAGS GYON 0F3C; Opening # (Ps) TIBETAN MARK ANG KHANG GYON 169B; Opening # (Ps) OGHAM FEATHER MARK 2045; Opening # (Ps) LEFT SQUARE BRACKET WITH QUILL 207D; Opening # (Ps) SUPERSCRIPT LEFT PARENTHESIS 208D; Opening # (Ps) SUBSCRIPT LEFT PARENTHESIS 2308; Opening # (Ps) LEFT CEILING 230A; Opening # (Ps) LEFT FLOOR 2329; Opening # (Ps) LEFT-POINTING ANGLE BRACKET 2768; Opening # (Ps) MEDIUM LEFT PARENTHESIS ORNAMENT 276A; Opening # (Ps) MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT 276C; Opening # (Ps) MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT 276E; Opening # (Ps) HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT 2770; Opening # (Ps) HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT 2772; Opening # (Ps) LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT 2774; Opening # (Ps) MEDIUM LEFT CURLY BRACKET ORNAMENT 27C5; Opening # (Ps) LEFT S-SHAPED BAG DELIMITER 27E6; Opening # (Ps) MATHEMATICAL LEFT WHITE SQUARE BRACKET 27E8; Opening # (Ps) MATHEMATICAL LEFT ANGLE BRACKET 27EA; Opening # (Ps) MATHEMATICAL LEFT DOUBLE ANGLE BRACKET 27EC; Opening # (Ps) MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET 27EE; Opening # (Ps) MATHEMATICAL LEFT FLATTENED PARENTHESIS 2983; Opening # (Ps) LEFT WHITE CURLY BRACKET 2985; Opening # (Ps) LEFT WHITE PARENTHESIS 2987; Opening # (Ps) Z NOTATION LEFT IMAGE BRACKET 2989; Opening # (Ps) Z NOTATION LEFT BINDING BRACKET 298B; Opening # (Ps) LEFT SQUARE BRACKET WITH UNDERBAR 298D; Opening # (Ps) LEFT SQUARE BRACKET WITH TICK IN TOP CORNER 298F; Opening # (Ps) LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 2991; Opening # (Ps) LEFT ANGLE BRACKET WITH DOT 2993; Opening # (Ps) LEFT ARC LESS-THAN BRACKET 2995; Opening # (Ps) DOUBLE LEFT ARC GREATER-THAN BRACKET 2997; Opening # (Ps) LEFT BLACK TORTOISE SHELL BRACKET 29D8; Opening # (Ps) LEFT WIGGLY FENCE 29DA; Opening # (Ps) LEFT DOUBLE WIGGLY FENCE 29FC; Opening # (Ps) LEFT-POINTING CURVED ANGLE BRACKET 2E22; Opening # (Ps) TOP LEFT HALF BRACKET 2E24; Opening # (Ps) BOTTOM LEFT HALF BRACKET 2E26; Opening # (Ps) LEFT SIDEWAYS U BRACKET 2E28; Opening # (Ps) LEFT DOUBLE PARENTHESIS 2E55; Opening # (Ps) LEFT SQUARE BRACKET WITH STROKE 2E57; Opening # (Ps) LEFT SQUARE BRACKET WITH DOUBLE STROKE 2E59; Opening # (Ps) TOP HALF LEFT PARENTHESIS 2E5B; Opening # (Ps) BOTTOM HALF LEFT PARENTHESIS 3008; Opening # (Ps) LEFT ANGLE BRACKET 300A; Opening # (Ps) LEFT DOUBLE ANGLE BRACKET 300C; Opening # (Ps) LEFT CORNER BRACKET 300E; Opening # (Ps) LEFT WHITE CORNER BRACKET 3010; Opening # (Ps) LEFT BLACK LENTICULAR BRACKET 3014; Opening # (Ps) LEFT TORTOISE SHELL BRACKET 3016; Opening # (Ps) LEFT WHITE LENTICULAR BRACKET 3018; Opening # (Ps) LEFT WHITE TORTOISE SHELL BRACKET 301A; Opening # (Ps) LEFT WHITE SQUARE BRACKET FE59; Opening # (Ps) SMALL LEFT PARENTHESIS FE5B; Opening # (Ps) SMALL LEFT CURLY BRACKET FE5D; Opening # (Ps) SMALL LEFT TORTOISE SHELL BRACKET FF08; Opening # (Ps) FULLWIDTH LEFT PARENTHESIS FF3B; Opening # (Ps) FULLWIDTH LEFT SQUARE BRACKET FF5B; Opening # (Ps) FULLWIDTH LEFT CURLY BRACKET FF5F; Opening # (Ps) FULLWIDTH LEFT WHITE PARENTHESIS FF62; Opening # (Ps) HALFWIDTH LEFT CORNER BRACKET # LinkPairedOpeners # draft = BidiPairedBracket 0029; 0028 # “)” RIGHT PARENTHESIS 🡆 “(” LEFT PARENTHESIS 005D; 005B # “]” RIGHT SQUARE BRACKET 🡆 “[” LEFT SQUARE BRACKET 007D; 007B # “}” RIGHT CURLY BRACKET 🡆 “{” LEFT CURLY BRACKET 0F3B; 0F3A # “༻” TIBETAN MARK GUG RTAGS GYAS 🡆 “༺” TIBETAN MARK GUG RTAGS GYON 0F3D; 0F3C # “༽” TIBETAN MARK ANG KHANG GYAS 🡆 “༼” TIBETAN MARK ANG KHANG GYON 169C; 169B # “᚜” OGHAM REVERSED FEATHER MARK 🡆 “᚛” OGHAM FEATHER MARK 2046; 2045 # “⁆” RIGHT SQUARE BRACKET WITH QUILL 🡆 “⁅” LEFT SQUARE BRACKET WITH QUILL 207E; 207D # “⁾” SUPERSCRIPT RIGHT PARENTHESIS 🡆 “⁽” SUPERSCRIPT LEFT PARENTHESIS 208E; 208D # “₎” SUBSCRIPT RIGHT PARENTHESIS 🡆 “₍” SUBSCRIPT LEFT PARENTHESIS 2309; 2308 # “⌉” RIGHT CEILING 🡆 “⌈” LEFT CEILING 230B; 230A # “⌋” RIGHT FLOOR 🡆 “⌊” LEFT FLOOR 232A; 2329 # “〉” RIGHT-POINTING ANGLE BRACKET 🡆 “〈” LEFT-POINTING ANGLE BRACKET 2769; 2768 # “❩” MEDIUM RIGHT PARENTHESIS ORNAMENT 🡆 “❨” MEDIUM LEFT PARENTHESIS ORNAMENT 276B; 276A # “❫” MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT 🡆 “❪” MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT 276D; 276C # “❭” MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT 🡆 “❬” MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT 276F; 276E # “❯” HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT 🡆 “❮” HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT 2771; 2770 # “❱” HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT 🡆 “❰” HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT 2773; 2772 # “❳” LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT 🡆 “❲” LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT 2775; 2774 # “❵” MEDIUM RIGHT CURLY BRACKET ORNAMENT 🡆 “❴” MEDIUM LEFT CURLY BRACKET ORNAMENT 27C6; 27C5 # “⟆” RIGHT S-SHAPED BAG DELIMITER 🡆 “⟅” LEFT S-SHAPED BAG DELIMITER 27E7; 27E6 # “⟧” MATHEMATICAL RIGHT WHITE SQUARE BRACKET 🡆 “⟦” MATHEMATICAL LEFT WHITE SQUARE BRACKET 27E9; 27E8 # “⟩” MATHEMATICAL RIGHT ANGLE BRACKET 🡆 “⟨” MATHEMATICAL LEFT ANGLE BRACKET 27EB; 27EA # “⟫” MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET 🡆 “⟪” MATHEMATICAL LEFT DOUBLE ANGLE BRACKET 27ED; 27EC # “⟭” MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET 🡆 “⟬” MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET 27EF; 27EE # “⟯” MATHEMATICAL RIGHT FLATTENED PARENTHESIS 🡆 “⟮” MATHEMATICAL LEFT FLATTENED PARENTHESIS 2984; 2983 # “⦄” RIGHT WHITE CURLY BRACKET 🡆 “⦃” LEFT WHITE CURLY BRACKET 2986; 2985 # “⦆” RIGHT WHITE PARENTHESIS 🡆 “⦅” LEFT WHITE PARENTHESIS 2988; 2987 # “⦈” Z NOTATION RIGHT IMAGE BRACKET 🡆 “⦇” Z NOTATION LEFT IMAGE BRACKET 298A; 2989 # “⦊” Z NOTATION RIGHT BINDING BRACKET 🡆 “⦉” Z NOTATION LEFT BINDING BRACKET 298C; 298B # “⦌” RIGHT SQUARE BRACKET WITH UNDERBAR 🡆 “⦋” LEFT SQUARE BRACKET WITH UNDERBAR 298E; 298F # “⦎” RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 🡆 “⦏” LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 2990; 298D # “⦐” RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER 🡆 “⦍” LEFT SQUARE BRACKET WITH TICK IN TOP CORNER 2992; 2991 # “⦒” RIGHT ANGLE BRACKET WITH DOT 🡆 “⦑” LEFT ANGLE BRACKET WITH DOT 2994; 2993 # “⦔” RIGHT ARC GREATER-THAN BRACKET 🡆 “⦓” LEFT ARC LESS-THAN BRACKET 2996; 2995 # “⦖” DOUBLE RIGHT ARC LESS-THAN BRACKET 🡆 “⦕” DOUBLE LEFT ARC GREATER-THAN BRACKET 2998; 2997 # “⦘” RIGHT BLACK TORTOISE SHELL BRACKET 🡆 “⦗” LEFT BLACK TORTOISE SHELL BRACKET 29D9; 29D8 # “⧙” RIGHT WIGGLY FENCE 🡆 “⧘” LEFT WIGGLY FENCE 29DB; 29DA # “⧛” RIGHT DOUBLE WIGGLY FENCE 🡆 “⧚” LEFT DOUBLE WIGGLY FENCE 29FD; 29FC # “⧽” RIGHT-POINTING CURVED ANGLE BRACKET 🡆 “⧼” LEFT-POINTING CURVED ANGLE BRACKET 2E23; 2E22 # “⸣” TOP RIGHT HALF BRACKET 🡆 “⸢” TOP LEFT HALF BRACKET 2E25; 2E24 # “⸥” BOTTOM RIGHT HALF BRACKET 🡆 “⸤” BOTTOM LEFT HALF BRACKET 2E27; 2E26 # “⸧” RIGHT SIDEWAYS U BRACKET 🡆 “⸦” LEFT SIDEWAYS U BRACKET 2E29; 2E28 # “⸩” RIGHT DOUBLE PARENTHESIS 🡆 “⸨” LEFT DOUBLE PARENTHESIS 2E56; 2E55 # “⹖” RIGHT SQUARE BRACKET WITH STROKE 🡆 “⹕” LEFT SQUARE BRACKET WITH STROKE 2E58; 2E57 # “⹘” RIGHT SQUARE BRACKET WITH DOUBLE STROKE 🡆 “⹗” LEFT SQUARE BRACKET WITH DOUBLE STROKE 2E5A; 2E59 # “⹚” TOP HALF RIGHT PARENTHESIS 🡆 “⹙” TOP HALF LEFT PARENTHESIS 2E5C; 2E5B # “⹜” BOTTOM HALF RIGHT PARENTHESIS 🡆 “⹛” BOTTOM HALF LEFT PARENTHESIS 3009; 3008 # “〉” RIGHT ANGLE BRACKET 🡆 “〈” LEFT ANGLE BRACKET 300B; 300A # “》” RIGHT DOUBLE ANGLE BRACKET 🡆 “《” LEFT DOUBLE ANGLE BRACKET 300D; 300C # “」” RIGHT CORNER BRACKET 🡆 “「” LEFT CORNER BRACKET 300F; 300E # “』” RIGHT WHITE CORNER BRACKET 🡆 “『” LEFT WHITE CORNER BRACKET 3011; 3010 # “】” RIGHT BLACK LENTICULAR BRACKET 🡆 “【” LEFT BLACK LENTICULAR BRACKET 3015; 3014 # “〕” RIGHT TORTOISE SHELL BRACKET 🡆 “〔” LEFT TORTOISE SHELL BRACKET 3017; 3016 # “〗” RIGHT WHITE LENTICULAR BRACKET 🡆 “〖” LEFT WHITE LENTICULAR BRACKET 3019; 3018 # “〙” RIGHT WHITE TORTOISE SHELL BRACKET 🡆 “〘” LEFT WHITE TORTOISE SHELL BRACKET 301B; 301A # “〛” RIGHT WHITE SQUARE BRACKET 🡆 “〚” LEFT WHITE SQUARE BRACKET FE5A; FE59 # “﹚” SMALL RIGHT PARENTHESIS 🡆 “﹙” SMALL LEFT PARENTHESIS FE5C; FE5B # “﹜” SMALL RIGHT CURLY BRACKET 🡆 “﹛” SMALL LEFT CURLY BRACKET FE5E; FE5D # “﹞” SMALL RIGHT TORTOISE SHELL BRACKET 🡆 “﹝” SMALL LEFT TORTOISE SHELL BRACKET FF09; FF08 # “)” FULLWIDTH RIGHT PARENTHESIS 🡆 “(” FULLWIDTH LEFT PARENTHESIS FF3D; FF3B # “]” FULLWIDTH RIGHT SQUARE BRACKET 🡆 “[” FULLWIDTH LEFT SQUARE BRACKET FF5D; FF5B # “}” FULLWIDTH RIGHT CURLY BRACKET 🡆 “{” FULLWIDTH LEFT CURLY BRACKET FF60; FF5F # “⦆” FULLWIDTH RIGHT WHITE PARENTHESIS 🡆 “⦅” FULLWIDTH LEFT WHITE PARENTHESIS FF63; FF62 # “」” HALFWIDTH RIGHT CORNER BRACKET 🡆 “「” HALFWIDTH LEFT CORNER BRACKET
For comparison to the related General_Category values, see the characters in:
TBD
TBD
TBD
The following summarizes modifications from the previous revision of this document.
TBD
Modifications for previous versions are listed in those respective versions.
© 2024–2024 Unicode, Inc. This publication is protected by copyright, and permission must be obtained from Unicode, Inc. prior to any reproduction, modification, or other use not permitted by the Terms of Use. Specifically, you may make copies of this publication and may annotate and translate it solely for personal or internal business purposes and not for public distribution, provided that any such permitted copies and modifications fully reproduce all copyright and other legal notices contained in the original. You may not make copies of or modifications to this publication for public distribution, or incorporate it in whole or in part into any product or publication without the express written permission of Unicode.
Use of all Unicode Products, including this publication, is governed by the Unicode Terms of Use. The authors, contributors, and publishers have taken care in the preparation of this publication, but make no express or implied representation or warranty of any kind and assume no responsibility or liability for errors or omissions or for consequential or incidental damages that may arise therefrom. This publication is provided “AS-IS” without charge as a convenience to users.
Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the United States and other countries.