Repository navigation
Unicode version 2.1.0
Enhancements
-
Resolves the property value that a UCD
@missingannotation declares as the default.Grapheme_Cluster_Break,Word_BreakandSentence_Breaknow answerOther(and itsXXalias), andLine_BreakanswersXX, for every codepoint the data files do not list.Line_Breakpreviously covered only 358,578 of the 1,114,112 codepoints; the remainder, including all private use, resolved only through a lookup fallback and was invisible to anything enumerating the property. Where a value is both listed explicitly and named as the@missingdefault, asXXis forLine_Break, the two sets are merged rather than replaced. -
Adds the
ageproperty value aliases fromPropertyValueAliases.txt, soUnicode.Age.fetch("V18_0")resolves the same set asUnicode.Age.fetch("18.0"). -
Updates the underlying data to the final Unicode 18.0 release (16 September 2026), adding the
Jurchen,Proto_CuneiformandSealscripts, seven new blocks and ten newCrown_*joining groups. -
Adds
Unicode.ScriptExtensionsfor theScript_Extensions(scx) property, the last UCD enumerated property without a backing module and a UTS #18 RL1.2 conformance requirement.Unicode.ScriptExtensions.script_extensions/1returns the set of scripts a codepoint is used with, defaulting to itsScriptvalue where the UCD lists no explicit set. -
Unicode.CharacterName.to_codepoint/2accepts a:fuzzyoption that resolves a misspelled name byString.jaro_distance/2, either astruefor the default distance of0.8or as an explicit distance. It succeeds only where one name is strictly closest than all others, so an ambiguous query returns:errorrather than guessing. -
Adds
Unicode.CharacterName.to_name/1, the reverse ofto_codepoint/1, returning theNameproperty of a codepoint. Each name is still stored only once — the original is reconstructed from the normalized form plus separator positions — so reverse lookup adds about 410KB rather than a second name table, and leavesto_codepoint/1unchanged in speed. -
Unicode.CharacterName.to_codepoint/1now resolves algorithmically derived names — CJK and Tangut ideographs, Hangul syllables, and the Seal and Jurchen characters — covering a further 131,576 characters. The names are computed from the UAX #44 derivation rules on a table-lookup miss rather than stored, adding under 4KB. -
mix unicode.downloadnow resolves the UCD and emoji trees through independent release channels, settable per run with--release/--emoji-release, by environment variable, or in application config. Adds--intoto download to a scratch directory,--dry-run, and a post-download check that every data file reports the same Unicode version. -
Adds the enumerated property modules
Unicode.Age,Unicode.NumericType,Unicode.NumericValue,Unicode.DecompositionType,Unicode.HangulSyllableType,Unicode.IndicPositionalCategory,Unicode.VerticalOrientation,Unicode.JoiningGroupandUnicode.BidiPairedBracketType, each with a codepoint lookup, range introspection and a top-level delegate onUnicode. -
Adds the normalization quick check modules
Unicode.NfcQuickCheck,Unicode.NfdQuickCheck,Unicode.NfkcQuickCheckandUnicode.NfkdQuickCheck(theNFC_QC,NFD_QC,NFKC_QCandNFKD_QCproperties) withUnicode.nfc_quick_check/1and friends. -
Adds
Bidi_Mirroredas a first class boolean property, soUnicode.Property.bidi_mirrored?/1andUnicode.properties/1now report it. -
The
Nameproperty now resolves throughUnicode.fetch_property/1toUnicode.CharacterName. -
Adds the UTS #58 link properties
Unicode.LinkTerm,Unicode.LinkEmailandUnicode.LinkBracket, which together drive link detection in flowing text.mix unicode.downloadgains alinkificationtree alongside the UCD and emoji trees to fetch them. -
Adds the
LC(Cased_Letter) general category, the union ofLu,LlandLt. It is the only General_Category group whose name is not a single letter, so it was not produced by the derivation that yieldsL,N,Pand the rest, andUnicode.GeneralCategory.fetch("lc")returned:errordespite the alias being advertised.
Bug fixes
-
Property aliases containing an underscore (for example
nfc_qc) are now reachable throughUnicode.fetch_property/1, which previously only matched the whitespace-stripped canonical form. -
Scripts and blocks whose
PropertyValueAliasesline carries more than two names now resolve by every spelling.Unicode.Script.fetch/1failed for"copt"and"qaac", andUnicode.Block.fetch/1for"latin1sup"and"cyrillicsupplementary", because the alias map was built by inverting a many-to-one map and elected a name absent from the data. -
Unicode.version/0no longer reports a stale version after the data files are updated. It derives the version fromblocks.txtat compile time but did not declare it as an@external_resource, so the module was not recompiled when the data changed. -
mix unicode.downloadno longer requests a non-existent emoji URL. The emoji files are versioned separately from the UCD andPublic/emoji/17.0/was never published, so the previous version-interpolated path returned 404 and the files had to be updated by hand.