Unicode v2.0.0

This is the changelog for Unicode v2.0.0 released on July 9th, 2026. For older changelogs please consult the release tag on GitHub

This is a major release that folds the unicode_guards library into unicode and replaces the hand-maintained derived category tables with values computed directly from the character database.

Breaking changes

  • The Unicode.Guards module is now provided by this library. The separate unicode_guards package is no longer required; remove it from your dependencies and depend on unicode instead.

  • The derived general categories :Assigned, :Graph, :Visible and :Printable now reflect the current Unicode data. The previous static tables were stale: :Assigned gained 15,942 codepoints (283,440 to 299,382), :Graph/:Visible gained the same 15,942 (281,308 to 297,250), and :Printable is corrected to match String.printable?/1 (it previously excluded most of the BMP, including Arabic, CJK and Hangul).

  • The internal Unicode.DerivedCategory.Assigned and Unicode.DerivedCategory.Graph modules have been removed; these categories are now computed at compile time.

Enhancements

  • Adds Unicode.CharacterName.to_codepoint/1, which resolves a Unicode character name to its codepoint with loose matching. The name table is stored as a sorted binary blob with a binary search to keep it compact.

  • Codepoint lookup functions such as Unicode.GeneralCategory.category/1, Unicode.Script.script/1 and the Unicode.Property boolean functions are now implemented with binary search over compact range tables instead of very large generated guard clauses. Compilation is an order of magnitude faster and codepoint lookups are approximately 10x faster.

  • Adds Unicode.RangeSearch which builds the range search tables at compile time and performs the binary search over them.

  • Documentation for all public modules and functions now follows a standard format with arguments, return values and examples.

  • Removes the unused and incorrect Unicode.Utils.remove_reserved_codepoints/1.

  • Adds Unicode.Guards, a set of guards (is_upper/1, is_lower/1, is_digit/1, is_whitespace/1, is_graph/1, the quotation-mark guards and more) for use in function when clauses. Folded in from unicode_guards with no runtime dependencies.

  • Derived categories are computed from the character database using new range-set helpers (Unicode.Utils.union_ranges/1, complement_ranges/1 and difference_ranges/2), removing the need to regenerate static tables by hand each release.

Bug Fixes

  • Fix UTF-16 and UTF-32 validation. Unicode.replace_invalid/3 for the :utf16, :utf16be, :utf16le, :utf32, :utf32be and :utf32le encodings previously crashed on any input and dropped valid codepoints.

  • Fix :utf32 validation dispatching to the UTF-16 implementation.

  • Replacement strings for UTF-16 and UTF-32 validation are now transcoded to the target encoding rather than being spliced in as UTF-8 bytes.

  • Fix Unicode.compact_ranges/1 truncating a range that fully contains the following range.

  • Fix Unicode.Emoji.emoji/1 returning nil for single-codepoint emoji graphemes in a string.

  • Fix Unicode.Block.fetch/1 and Unicode.Block.get/1 for block names containing digits, such as "Latin-1 Supplement" and "Number Forms", which previously returned :error/nil for every spelling of the canonical name because no alias mapped the normalised name to the block key.

Unicode v1.22.0

This is the changelog for Unicode v1.22.0 released on May 4th, 2026. For older changelogs please consult the release tag on GitHub

Enhancements

  • Adds the Bidi_Class Unicode property.

  • Adds the Joining_Type Unicode property.

Unicode v1.21.2

This is the changelog for Unicode v1.21.2 released on April 29th, 2026. For older changelogs please consult the release tag on GitHub

Breaking changes

  • Supported on Elixir 1.17 and later only.

Bug Fixes

Unicode v1.21.1

This is the changelog for Unicode v1.21.1 released on March 16th, 2026. For older changelogs please consult the release tag on GitHub

Bug Fixes

  • Compiles without warning on Elixir 1.20.0-rc.3.

Unicode v1.21.0

This is the changelog for Unicode v1.21.0 released on January 19th, 2025. For older changelogs please consult the release tag on GitHub

Enhancements

Unicode v1.20.0

This is the changelog for Unicode v1.20.0 released on September 11, 2024. For older changelogs please consult the release tag on GitHub

Enhancements

Unicode v1.19.0

This is the changelog for Unicode v1.19.0 released on February 29th, 2024. For older changelogs please consult the release tag on GitHub

Bug Fixes

Enhancements

  • Add indic_conjunc_break as a property, it is new in Unicode 15.1.

  • Fix performance regression in Unicode.replace_invalid/2 from the original UniRecover library and confirm the code memory usage remains a constant 128 bytes for all benchmark scenarios. Thanks to @Moosieus for the fabulous PR. Closes #10.

  • Unicode.replace_invalid(string, :utf8, replacement) delegates to String.replace_invalid/2 where available (which will be from Elixir 1.16 onwards).

  • Confirm that the README installation version matches the code version. Thanks to @Moosieus for the PR.

Unicode v1.18.0

This is the changelog for Unicode v1.18.0 released on October 19th, 2023. For older changelogs please consult the release tag on GitHub

Enhancements

  • Adds Unicode.replace_invalid/3 to force-validate a binary as a UTF string. Any of the UTF encodings may be validated. Any invalid codepoints or incomplete sequences are replaced with a replacement string. Many thanks to @Moosieus for the contribution.

Unicode v1.17.0

This is the changelog for Unicode v1.17.0 released on September 17th, 2023. For older changelogs please consult the release tag on GitHub

Enhancements

  • Updates to Unicode 15.1 data.

  • Improve the security of the mix unicode.download task.

Unicode v1.16.2

This is the changelog for Unicode v1.16.2 released on August 16th, 2023. For older changelogs please consult the release tag on GitHub

Enhancements

  • Change the parsing of "SpecialCasing.text" specifically to support casing in unicode_string/.

Unicode v1.16.1

This is the changelog for Unicode v1.16.1 released on April 22nd, 2023. For older changelogs please consult the release tag on GitHub

Big Fixes

Unicode v1.16.0

This is the changelog for Unicode v1.16.0 released on March 18th, 2023. For older changelogs please consult the release tag on GitHub

Enhancements

Unicode v1.15.0

This is the changelog for Unicode v1.15.0 released on September 17th, 2022. For older changelogs please consult the release tag on GitHub

Note there is no release 1.14. The release is 1.15 to align with Unicode 15 and it is expected to keep this pattern into the future.

Deprecations

  • Fix deprecation warnings for Elixir 1.14. Now requires Elixir 1.11 as a minimum release.

Enhancements

Bug Fixes

  • Fix code fences in docs to be Elixir

Unicode v1.13.1

This is the changelog for Unicode v1.13.1 released on September 16th, 2021. For older changelogs please consult the release tag on GitHub

Bug Fixes

  • When looking up scripts, general categories and properties we indirect through an alias table. But not all entries have alias so in the case alias lookup fails we still need to lookup using the original key.

Unicode v1.13.0

This is the changelog for Unicode v1.13.0 released on September 15th, 2021. For older changelogs please consult the release tag on GitHub

Enhancements

  • Change the application name to :unicode (in collaboration with @Qqwy). The old name ex_unicode will be retired.

Unicode v1.12.0

This is the changelog for Unicode v1.12.0 released on September 14th, 2021. For older changelogs please consult the release tag on GitHub

Enhancements

Unicode v1.12.0-rc.0

This is the changelog for Unicode v1.12.0-rc.0 released on August 27th, 2021. For older changelogs please consult the release tag on GitHub

Enhancements

  • Updates to Unicode 14 preview data.

Unicode v1.11.2

This is the changelog for Unicode v1.11.2 released on May 25th, 2021. For older changelogs please consult the release tag on GitHub

Bug fixes

  • Make ex_doc and benchee optional. Thanks to @fireproofsocks.

Unicode v1.11.1

This is the changelog for Unicode v1.11.1 released on January 5th, 2021. For older changelogs please consult the release tag on GitHub

Bug fixes

  • Restrict ex_doc to only :dev and :release. Closes #3. Thanks to @manuelmontenegro.

  • Fix spec for Unicode.all/0 so dialyzer is happy

Unicode v1.11.0

This is the changelog for Unicode v1.11.0 released on October 8th, 2020. For older changelogs please consult the release tag on GitHub

Bug fixes

  • Rename the derived category :visible to :graph and change the definition to that in Unicode Regular Expressions. Deprecate the derived category :visible.

Unicode v1.10.0

This is the changelog for Unicode v1.10.0 released on October 5th, 2020. For older changelogs please consult the release tag on GitHub

Bug fixes

  • Revert "Change the definition of the derived property All to be the disjoint set of unicode ranges, not the closed set." since All in the ICU means the full range of codepoints, assigned or otherwise.

  • Add :inets and :public_key to :extra_applicatons to avoid warnings on Elixir 1.11.

Enhancements

Unicode v1.9.0

This is the changelog for Unicode v1.9.0 released on October 4th, 2020. For older changelogs please consult the release tag on GitHub

Enhancements

  • Change the definition of the derived property All to be the disjoint set of unicode ranges, not the closed set.

Unicode v1.8.0

This is the changelog for Unicode v1.8.0 released on July 12th, 2020. For older changelogs please consult the release tag on GitHub

Enhancements

  • Add the east asian width property to Unicode.Property.fetch/2 API

  • Add the word break property to Unicode.Property.fetch/2 API

Unicode v1.7.0

This is the changelog for Unicode v1.7.0 released on June 22nd, 2020. For older changelogs please consult the release tag on GitHub

Enhancements

  • Add the emoji properties to Uniccode.Property.fetch/2 API

  • Add certificate verification to download process

Unicode v1.6.0

This is the changelog for Unicode v1.6.0 released on May 17th, 2020. For older changelogs please consult the release tag on GitHub

Enhancements

  • Add Unicode.Utils.case_folding/0

  • Add Unicode.Utils.special_casing/0

Unicode v1.5.0

This is the changelog for Unicode v1.5.0 released on March 14th, 2020. For older changelogs please consult the release tag on GitHub

Enhancements

  • Add derived categories :printable: and :visible:. :printable: implements the same semnantics String.printable?/1. :visible: combines the categories [[:L:][:N:][:M:][:P:][:S:][:Zs:]].

Unicode v1.4.1

This is the changelog for Unicode v1.4.1 released on March 11th, 2020. For older changelogs please consult the release tag on GitHub

Bug Fixes

  • Regenerate the assigned ranges for Unicode 13

Unicode v1.4.0

This is the changelog for Unicode v1.4.0 released on March 11th, 2020. For older changelogs please consult the release tag on GitHub

Enhancements

Updates Unicode to version 13.0.

As of March 2020, Unicode has introduced Unicode 13.0 and this data now forms the basis of ex_unicode version 1.40. Version 13 of Unicode adds 5,390 characters, for a total of 143,859 characters. These additions include four new scripts, for a total of 154 scripts, as well as 55 new emoji characters.

Adds derived categories for various quotation marks.

Although the unicode character database has a flag to indicate if a given codepoint is a quotation mark, the list does not include CJK quotation marks, dingbats or alternative encodings. Some additional derived categories are therefore added that are taken from Wikipedia. The added dervived categories are:

  • QuoteMark - all quote marks
  • QuoteMarkLeft - all quote marks used on the left
  • QuoteMarkRight - quote marks used on the right
  • QuoteMarkAmbidextrous - quote marks used either left or right
  • QuoteMarkSingle - single quote marks
  • QuoteMarkDouble - double quote marks

These additional derived categories can be used in Unicode Sets, for example:

iex> Unicode.Set.match? ?', "[[:quote_mark:]]"
true
iex> Unicode.Set.match? ?', "[[:quote_mark_left:]]"
false
iex> Unicode.Set.match? ?', "[[:quote_mark_ambidextrous:]]"
true

Unicode v1.3.1

This is the changelog for Unicode v1.3.1 released on January 8th, 2020. For older changelogs please consult the release tag on GitHub

Bug Fixes

  • Remove call to Code.ensure_compiled?/1 which is deprecated in Elixir 1.10.0.

  • Fix the ranges for the General Category :assigned.

Unicode v1.3.0

This is the changelog for Unicode v1.3.0 released on December 3rd, 2019. For older changelogs please consult the release tag on GitHub

Breaking Changes

  • Changed two module names: Unicode.Category becomes Unicode.GeneralCategory and Unicode.CombiningClass becomes Unicode.CanonicalCombiningClass. These names map directly to the Unicode standard names. It also means all property module names can be derived from the Unicode property name which is what the new Unicode.servers/0 function does.

Enhancements

  • Add property modules for line break, sentence break, grapheme cluster break and indic syllabic category. These properties are used by the CLDR and Unicode segmentation rules.

  • Add Unicode.servers/0 that maps property names and aliases to a module name that serves that property.

Bug fixes

  • Fixes Unicode.aliases/0 to correctly use the aliases in data/property_alias.txt

Unicode v1.2.0

This is the changelog for Unicode v1.2.0 released on November 27th, 2019. For older changelogs please consult the release tag on GitHub

Breaking Changes

  • Script names are now atoms instead of strings to be consistent with other properties

Enhancements

  • Add aliases/0, fetch/1 and get/1 to Unicode.Property

  • Added additional properties to Unicode.Property. The set now includes those from the UCD files DerivedCoreProperties.txt and PropList.txt.

Unicode v1.1.0

This is the changelog for Unicode v1.1.0 released on November 23rd, 2019. For older changelogs please consult the release tag on GitHub

Breaking Changes

Enhancements

  • Unicode.Category.categories/0 now returns the super categories as well as the subcategories. These super categories are computed at compile time by consolidating the relevant subcategories. Unicode.Category.category/1 will only return one category, and it will be the subcategory as it consistent with earlier releases.

  • Add Unicode.ranges/0 that returns all Unicode codepoints as a list of 2-tuples representing the disjoint ranges of valid codepoints. The list is in sorted order.

  • Add aliases/0 for Unicode.Category, Unicode.Script, Unicode.Block, and Unicode.CombiningClass which returns the alias map for the relevant module.

  • Add fetch/1 and get/1 for Unicode.Category, Unicode.Script, Unicode.Block, and Unicode.CombiningClass. These functions leverage Unicode property value aliases for retrieving codepoints.

  • Add Unicode.fetch_property/1 and Unicode.get_property/1 that return the module responsible for handling a given Unicode property.

  • Add Unicode.compact_ranges/1 that given a list of 2-tuple ranges will compact them into as small a list of contiguous blocks as possible

  • Documented all public functions

Unicode v1.0.0

This is the changelog for Unicode v1.0.0 released on November 14th, 2019. For older changelogs please consult the release tag on GitHub

Breaking Changes

  • Rename the module prefix to Unicode since this package is not linked in any way to the Cldr family. The hex package is renamed to ex_unicode.

Cldr Unicode v0.7.1

This is the changelog for Unicode v0.7.1 released on November 12th, 2019. For older changelogs please consult the release tag on GitHub

Bug Fixes

  • Fixes count/1 for blocks, scripts and categories

  • Replace deprecated String.normalize/2 with :unicode.characters_to_nfd_binary/ for OTP release 20 and later.

Cldr Unicode v0.7.0

This is the changelog for Unicode v0.7.0 released on November 12th, 2019. For older changelogs please consult the release tag on GitHub

Enhancements

  • Add is_whitespace/1 guard generator

Cldr Unicode v0.6.0

This is the changelog for Unicode v0.6.0 released on October 22nd, 2019. For older changelogs please consult the release tag on GitHub

Enhancements

  • Update to Emoji 12.1

Cldr Unicode v0.5.0

This is the changelog for Unicode v0.5.0 released on May 12th, 2019. For older changelogs please consult the release tag on GitHub

Enhancements

  • Update to Unicode 12.1

Cldr Unicode v0.4.0

This is the changelog for Unicode v0.4.0 released on April 30th, 2019. For older changelogs please consult the release tag on GitHub

Enhancements

  • Adds Cldr.Unicode.unaccent/1

Breaking Changes

  • Block names are now atoms instead of strings

Cldr Unicode v0.3.0

This is the changelog for Unicode v0.3.0 released on March 28th, 2019. For older changelogs please consult the release tag on GitHub

Enhancements

  • Updated to Unicode version 12

Cldr Unicode v0.2.0

This is the changelog for Unicode v0.2.0 released on February 24th, 2019. For older changelogs please consult the release tag on GitHub

Enhancements

  • Moves the public API to the Cldr.Unicode module.

  • Updates and adds documentation to all public functions.

  • Removes the text annotations from the compiled functions which materially reduces the size of the beam files.

Cldr Unicode v0.1.0

This is the changelog for Unicode v0.1.0 released on February 23rd, 2019. For older changelogs please consult the release tag on GitHub

Enhancements

  • Initial release