├── .npmrc ├── .gitattributes ├── .gitignore ├── .github ├── security.md └── workflows │ └── main.yml ├── .editorconfig ├── package.json ├── license ├── index.js ├── locale-replacements.js ├── index.d.ts ├── readme.md ├── test.js └── replacements.js /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | yarn.lock 3 | -------------------------------------------------------------------------------- /.github/security.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [*.yml] 11 | indent_style = space 12 | indent_size = 2 13 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | - push 4 | - pull_request 5 | jobs: 6 | test: 7 | name: Node.js ${{ matrix.node-version }} 8 | runs-on: ubuntu-latest 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | node-version: 13 | - 24 14 | - 20 15 | steps: 16 | - uses: actions/checkout@v5 17 | - uses: actions/setup-node@v5 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | - run: npm install 21 | - run: npm test 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sindresorhus/transliterate", 3 | "version": "2.2.0", 4 | "description": "Convert Unicode characters to Latin characters using transliteration", 5 | "license": "MIT", 6 | "repository": "sindresorhus/transliterate", 7 | "funding": "https://github.com/sponsors/sindresorhus", 8 | "author": { 9 | "name": "Sindre Sorhus", 10 | "email": "sindresorhus@gmail.com", 11 | "url": "https://sindresorhus.com" 12 | }, 13 | "type": "module", 14 | "exports": { 15 | "types": "./index.d.ts", 16 | "default": "./index.js" 17 | }, 18 | "sideEffects": false, 19 | "engines": { 20 | "node": ">=20" 21 | }, 22 | "scripts": { 23 | "test": "xo && ava" 24 | }, 25 | "files": [ 26 | "index.js", 27 | "index.d.ts", 28 | "replacements.js", 29 | "locale-replacements.js" 30 | ], 31 | "keywords": [ 32 | "transliterate", 33 | "transliteration", 34 | "string", 35 | "deburr", 36 | "unicode", 37 | "ascii", 38 | "text", 39 | "latin", 40 | "latinize", 41 | "convert", 42 | "replace" 43 | ], 44 | "devDependencies": { 45 | "ava": "^6.4.1", 46 | "xo": "^1.2.2" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Sindre Sorhus (https://sindresorhus.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import builtinReplacements from './replacements.js'; 2 | import localeReplacements from './locale-replacements.js'; 3 | 4 | const doCustomReplacements = (string, replacements) => { 5 | for (const [key, value] of replacements) { 6 | string = string.replaceAll(key, value); 7 | } 8 | 9 | return string; 10 | }; 11 | 12 | const getLocaleReplacements = locale => { 13 | if (!locale) { 14 | return undefined; 15 | } 16 | 17 | const normalizedLocale = locale.toLowerCase() 18 | // Norwegian (no) is an alias for Norwegian Bokmål (nb) 19 | .replace(/^no(-|$)/, 'nb$1'); 20 | 21 | return localeReplacements[normalizedLocale] 22 | || localeReplacements[normalizedLocale.split('-')[0]] 23 | || undefined; 24 | }; 25 | 26 | export default function transliterate(string, options) { 27 | if (typeof string !== 'string') { 28 | throw new TypeError(`Expected a string, got \`${typeof string}\``); 29 | } 30 | 31 | options = { 32 | customReplacements: [], 33 | ...options, 34 | }; 35 | 36 | const localeMap = getLocaleReplacements(options.locale); 37 | 38 | let replacements = builtinReplacements; 39 | 40 | const hasCustomReplacements = options.customReplacements.length > 0 || options.customReplacements.size > 0; 41 | 42 | if (localeMap || hasCustomReplacements) { 43 | replacements = new Map(builtinReplacements); 44 | 45 | if (localeMap) { 46 | for (const [key, value] of localeMap) { 47 | replacements.set(key, value); 48 | } 49 | } 50 | 51 | for (const [key, value] of options.customReplacements) { 52 | replacements.set(key, value); 53 | } 54 | } 55 | 56 | string = string.normalize(); 57 | string = doCustomReplacements(string, replacements); 58 | string = string.normalize('NFD').replaceAll(/\p{Diacritic}/gu, '').normalize(); 59 | 60 | // Normalize all dash types to hyphen-minus 61 | string = string.replaceAll(/\p{Dash_Punctuation}/gu, '-'); 62 | 63 | return string; 64 | } 65 | -------------------------------------------------------------------------------- /locale-replacements.js: -------------------------------------------------------------------------------- 1 | /** 2 | Language-specific replacement rules. 3 | 4 | Keys are BCP-47 language tags (or their prefixes). 5 | 6 | Values are arrays of [from, to] replacement pairs. 7 | 8 | These replacements take precedence over the default replacements when a matching locale is specified. 9 | */ 10 | 11 | // Shared Danish/Norwegian replacements 12 | const danishNorwegianReplacements = [ 13 | ['æ', 'ae'], 14 | ['Æ', 'Ae'], 15 | ['ø', 'oe'], 16 | ['Ø', 'Oe'], 17 | ['å', 'aa'], 18 | ['Å', 'Aa'], 19 | ]; 20 | 21 | const localeReplacements = { 22 | // Swedish 23 | sv: [ 24 | ['ä', 'a'], 25 | ['Ä', 'A'], 26 | ['ö', 'o'], 27 | ['Ö', 'O'], 28 | ['å', 'a'], 29 | ['Å', 'A'], 30 | ], 31 | 32 | // Danish 33 | da: danishNorwegianReplacements, 34 | 35 | // Norwegian Bokmål 36 | nb: danishNorwegianReplacements, 37 | 38 | // German 39 | de: [ 40 | ['ä', 'ae'], 41 | ['Ä', 'Ae'], 42 | ['ö', 'oe'], 43 | ['Ö', 'Oe'], 44 | ['ü', 'ue'], 45 | ['Ü', 'Ue'], 46 | ['ß', 'ss'], 47 | ['ẞ', 'Ss'], 48 | ], 49 | 50 | // Turkish 51 | tr: [ 52 | ['â', 'a'], 53 | ['Â', 'A'], 54 | ['ö', 'o'], 55 | ['Ö', 'O'], 56 | ['ü', 'u'], 57 | ['Ü', 'U'], 58 | ], 59 | 60 | // Hungarian 61 | hu: [ 62 | ['ű', 'u'], 63 | ['Ű', 'U'], 64 | ['ö', 'o'], 65 | ['Ö', 'O'], 66 | ['ü', 'u'], 67 | ['Ü', 'U'], 68 | ['á', 'a'], 69 | ['Á', 'A'], 70 | ['é', 'e'], 71 | ['É', 'E'], 72 | ['í', 'i'], 73 | ['Í', 'I'], 74 | ['ó', 'o'], 75 | ['Ó', 'O'], 76 | ['ú', 'u'], 77 | ['Ú', 'U'], 78 | ], 79 | 80 | // Serbian 81 | sr: [ 82 | ['ђ', 'dj'], 83 | ['Ђ', 'Dj'], 84 | ['џ', 'dz'], 85 | ['Џ', 'Dz'], 86 | ['љ', 'lj'], 87 | ['Љ', 'Lj'], 88 | ['њ', 'nj'], 89 | ['Њ', 'Nj'], 90 | ['ћ', 'c'], 91 | ['Ћ', 'C'], 92 | ['ч', 'ch'], 93 | ['Ч', 'Ch'], 94 | ['ш', 'sh'], 95 | ['Ш', 'Sh'], 96 | ['ж', 'zh'], 97 | ['Ж', 'Zh'], 98 | ], 99 | }; 100 | 101 | // Convert all locale replacements to Maps at module load time 102 | for (const locale of Object.keys(localeReplacements)) { 103 | localeReplacements[locale] = new Map(localeReplacements[locale]); 104 | } 105 | 106 | export default localeReplacements; 107 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | export type Options = { 2 | /** 3 | Add your own custom replacements. 4 | 5 | The replacements are run on the original string before any other transformations. 6 | 7 | This only overrides a default replacement if you set an item with the same key. 8 | 9 | @default [] 10 | 11 | @example 12 | ``` 13 | import transliterate from '@sindresorhus/transliterate'; 14 | 15 | transliterate('Я люблю единорогов', { 16 | customReplacements: [ 17 | ['единорогов', '🦄'] 18 | ] 19 | }) 20 | //=> 'Ya lyublyu 🦄' 21 | ``` 22 | 23 | @example 24 | ``` 25 | import transliterate from '@sindresorhus/transliterate'; 26 | 27 | transliterate('foo & bar', { 28 | customReplacements: new Map([ 29 | ['&', 'and'] 30 | ]) 31 | }) 32 | //=> 'foo and bar' 33 | ``` 34 | */ 35 | readonly customReplacements?: ReadonlyArray<[string, string]> | Map; 36 | 37 | /** 38 | [BCP-47](https://developer.mozilla.org/en-US/docs/Glossary/BCP_47_language_tag) language tag for language-specific transliteration. 39 | 40 | When specified, uses language-specific replacement rules for characters that have different transliterations in different languages. 41 | 42 | @example 43 | ``` 44 | import transliterate from '@sindresorhus/transliterate'; 45 | 46 | // Swedish: ä→a, ö→o, å→a 47 | transliterate('Räksmörgås', {locale: 'sv'}); 48 | //=> 'Raksmorgas' 49 | 50 | // German: ä→ae, ö→oe 51 | transliterate('Räksmörgås', {locale: 'de'}); 52 | //=> 'Raeksmoergas' 53 | ``` 54 | */ 55 | readonly locale?: string; 56 | }; 57 | 58 | /** 59 | Convert Unicode characters to Latin characters using [transliteration](https://en.wikipedia.org/wiki/Transliteration). 60 | 61 | @param string - String to transliterate. 62 | 63 | @example 64 | ``` 65 | import transliterate from '@sindresorhus/transliterate'; 66 | 67 | transliterate('Fußgängerübergänge'); 68 | //=> 'Fussgaengeruebergaenge' 69 | 70 | transliterate('Я люблю единорогов'); 71 | //=> 'Ya lyublyu edinorogov' 72 | 73 | transliterate('أنا أحب حيدات'); 74 | //=> 'ana ahb hydat' 75 | 76 | transliterate('tôi yêu những chú kỳ lân'); 77 | //=> 'toi yeu nhung chu ky lan' 78 | 79 | transliterate('En–dashes and em—dashes are normalized'); 80 | //=> 'En-dashes and em-dashes are normalized' 81 | ``` 82 | */ 83 | export default function transliterate(string: string, options?: Options): string; 84 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # transliterate 2 | 3 | > Convert Unicode characters to Latin characters using [transliteration](https://en.wikipedia.org/wiki/Transliteration) 4 | 5 | Can be useful for [slugification](https://github.com/sindresorhus/slugify) purposes and other times you cannot use Unicode. 6 | 7 | ## Install 8 | 9 | ```sh 10 | npm install @sindresorhus/transliterate 11 | ``` 12 | 13 | ## Usage 14 | 15 | ```js 16 | import transliterate from '@sindresorhus/transliterate'; 17 | 18 | transliterate('Fußgängerübergänge'); 19 | //=> 'Fussgaengeruebergaenge' 20 | 21 | transliterate('Я люблю единорогов'); 22 | //=> 'Ya lyublyu edinorogov' 23 | 24 | transliterate('أنا أحب حيدات'); 25 | //=> 'ana ahb hydat' 26 | 27 | transliterate('tôi yêu những chú kỳ lân'); 28 | //=> 'toi yeu nhung chu ky lan' 29 | 30 | transliterate('En–dashes and em—dashes are normalized'); 31 | //=> 'En-dashes and em-dashes are normalized' 32 | ``` 33 | 34 | ## API 35 | 36 | ### transliterate(string, options?) 37 | 38 | #### string 39 | 40 | Type: `string` 41 | 42 | String to transliterate. 43 | 44 | #### options 45 | 46 | Type: `object` 47 | 48 | ##### customReplacements 49 | 50 | Type: `Array | Map`\ 51 | Default: `[]` 52 | 53 | Add your own custom replacements. 54 | 55 | The replacements are run on the original string before any other transformations. 56 | 57 | This only overrides a default replacement if you set an item with the same key. 58 | 59 | ```js 60 | import transliterate from '@sindresorhus/transliterate'; 61 | 62 | transliterate('Я люблю единорогов', { 63 | customReplacements: [ 64 | ['единорогов', '🦄'] 65 | ] 66 | }) 67 | //=> 'Ya lyublyu 🦄' 68 | ``` 69 | 70 | You can also pass a `Map`: 71 | 72 | ```js 73 | transliterate('foo & bar', { 74 | customReplacements: new Map([ 75 | ['&', 'and'] 76 | ]) 77 | }) 78 | //=> 'foo and bar' 79 | ``` 80 | 81 | ##### locale 82 | 83 | Type: `string` 84 | 85 | [BCP-47](https://developer.mozilla.org/en-US/docs/Glossary/BCP_47_language_tag) language tag for language-specific transliteration. 86 | 87 | When specified, uses language-specific replacement rules for characters that have different transliterations in different languages. 88 | 89 | ```js 90 | import transliterate from '@sindresorhus/transliterate'; 91 | 92 | // Swedish: ä→a, ö→o, å→a 93 | transliterate('Räksmörgås', {locale: 'sv'}); 94 | //=> 'Raksmorgas' 95 | 96 | // German: ä→ae, ö→oe 97 | transliterate('Räksmörgås', {locale: 'de'}); 98 | //=> 'Raeksmoergas' 99 | ``` 100 | 101 | ### Supported locales 102 | 103 | The following locales have specific replacement rules when using the `locale` option: 104 | 105 | - `da` - Danish 106 | - `de` - German 107 | - `hu` - Hungarian 108 | - `nb` - Norwegian Bokmål 109 | - `sr` - Serbian 110 | - `sv` - Swedish 111 | - `tr` - Turkish 112 | 113 | ## Supported languages 114 | 115 | Most major languages are supported. 116 | 117 | This includes special handling for: 118 | 119 | - Arabic 120 | - Armenian 121 | - Czech 122 | - Danish 123 | - Dhivehi 124 | - Georgian 125 | - German (umlauts) 126 | - Greek 127 | - Hungarian 128 | - Latin 129 | - Latvian 130 | - Lithuanian 131 | - Macedonian 132 | - Pashto 133 | - Persian 134 | - Polish 135 | - Romanian 136 | - Russian 137 | - Serbian 138 | - Slovak 139 | - Swedish 140 | - Turkish 141 | - Ukrainian 142 | - Urdu 143 | - Vietnamese 144 | 145 | However, Chinese is [currently not supported](https://github.com/sindresorhus/transliterate/issues/1). 146 | 147 | ## Related 148 | 149 | - [slugify](https://github.com/sindresorhus/slugify) - Slugify a string 150 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import replacements from './replacements.js'; 3 | import transliterate from './index.js'; 4 | 5 | test('main', t => { 6 | t.is(transliterate('Foo ÿ'), 'Foo y'); 7 | t.is(transliterate('Hællæ, hva skjera?'), 'Haellae, hva skjera?'); 8 | t.is(transliterate('Déjà Vu!'), 'Deja Vu!'); 9 | }); 10 | 11 | test('customReplacements option', t => { 12 | t.is(transliterate('Zürich', { 13 | customReplacements: [ 14 | ['ä', 'ae'], 15 | ['ö', 'oe'], 16 | ['ü', 'ue'], 17 | ['ß', 'ss'], 18 | ], 19 | }), 'Zuerich'); 20 | }); 21 | 22 | test('customReplacements as Map', t => { 23 | const customReplacements = new Map([ 24 | ['&', ' and '], 25 | ['@', ' at '], 26 | ]); 27 | 28 | t.is(transliterate('file & bar', {customReplacements}), 'file and bar'); 29 | t.is(transliterate('foo@bar', {customReplacements}), 'foo at bar'); 30 | }); 31 | 32 | test('all replacements are ASCII', t => { 33 | const MAX_ASCII_CHARACTER_CODE = 127; 34 | 35 | for (const [original, replacement] of replacements) { 36 | if (replacement === '') { 37 | continue; 38 | } 39 | 40 | t.true(replacement.codePointAt(0) <= MAX_ASCII_CHARACTER_CODE, `${original} → ${replacement} (code: ${replacement.codePointAt(0)})`); 41 | } 42 | }); 43 | 44 | test('supports German umlauts', t => { 45 | t.is(transliterate('ä ö ü Ä Ö Ü ß'), 'ae oe ue Ae Oe Ue ss'); 46 | }); 47 | 48 | test('supports Vietnamese', t => { 49 | t.is(transliterate('ố Ừ Đ'), 'o U D'); 50 | }); 51 | 52 | test('supports Arabic', t => { 53 | t.is(transliterate('ث س و'), 'th s w'); 54 | t.is(transliterate('إ'), 'a'); // Issue #9 - alif with hamza below should be 'a' not 'i' 55 | }); 56 | 57 | test('supports Persian / Farsi', t => { 58 | t.is(transliterate('چ ی پ'), 'ch y p'); 59 | }); 60 | 61 | test('supports Urdu', t => { 62 | t.is(transliterate('ٹ ڈ ھ'), 't d h'); 63 | }); 64 | 65 | test('supports Pashto', t => { 66 | t.is(transliterate('ګ ړ څ'), 'g r c'); 67 | }); 68 | 69 | test('supports Russian', t => { 70 | t.is(transliterate('Ж п ю'), 'Zh p yu'); 71 | }); 72 | 73 | test('supports Romanian', t => { 74 | t.is(transliterate('ș Ț'), 's T'); 75 | }); 76 | 77 | test('supports Turkish', t => { 78 | t.is(transliterate('İ ı Ş ş Ç ç Ğ ğ'), 'I i S s C c G g'); 79 | }); 80 | 81 | test('supports Armenian', t => { 82 | t.is(transliterate('Ե ր և ա ն'), 'Ye r yev a n'); 83 | }); 84 | 85 | test('supports Georgian', t => { 86 | t.is(transliterate('თ პ ღ'), 't p gh'); 87 | }); 88 | 89 | test('supports Latin', t => { 90 | t.is(transliterate('Ä Ð Ø'), 'Ae D O'); 91 | }); 92 | 93 | test('supports Czech', t => { 94 | t.is(transliterate('č ž Ň'), 'c z N'); 95 | }); 96 | 97 | test('supports Danish', t => { 98 | t.is(transliterate('æ ø å Æ Ø Å', {locale: 'da'}), 'ae oe aa Ae Oe Aa'); 99 | }); 100 | 101 | test('supports Dhivehi', t => { 102 | t.is(transliterate('ޝ ޓ ބ'), 'sh t b'); 103 | }); 104 | 105 | test('supports Greek', t => { 106 | t.is(transliterate('θ Γ Ξ'), 'th G KS'); 107 | }); 108 | 109 | test('supports Hungarian', t => { 110 | t.is(transliterate('ű ö Ö', {locale: 'hu'}), 'u o O'); 111 | }); 112 | 113 | test('supports Latvian', t => { 114 | t.is(transliterate('ā Ņ Ģ'), 'a N G'); 115 | }); 116 | 117 | test('supports Lithuanian', t => { 118 | t.is(transliterate('ą į Š'), 'a i S'); 119 | }); 120 | 121 | test('supports Macedonian', t => { 122 | t.is(transliterate('Ќ љ Тс'), 'Kj lj Ts'); 123 | }); 124 | 125 | test('supports Polish', t => { 126 | t.is(transliterate('ą Ą Ł'), 'a A L'); 127 | }); 128 | 129 | test('supports Serbian', t => { 130 | t.is(transliterate('ђ џ Ђ Љ', {locale: 'sr'}), 'dj dz Dj Lj'); 131 | }); 132 | 133 | test('supports Slovak', t => { 134 | t.is(transliterate('ľ Ľ Ŕ'), 'l L R'); 135 | }); 136 | 137 | test('supports Swedish', t => { 138 | t.is(transliterate('ä ö Ä Ö', {locale: 'sv'}), 'a o A O'); 139 | }); 140 | 141 | test('supports Ukrainian', t => { 142 | t.is(transliterate('Є Ґ ї'), 'Ye G yi'); 143 | }); 144 | 145 | test('normalizes various dash types to hyphen', t => { 146 | // Testing various Unicode dash characters 147 | t.is(transliterate('en–dash'), 'en-dash'); // En dash (U+2013) 148 | t.is(transliterate('em—dash'), 'em-dash'); // Em dash (U+2014) 149 | t.is(transliterate('minus−sign'), 'minus-sign'); // Minus sign (U+2212) 150 | t.is(transliterate('figure‒dash'), 'figure-dash'); // Figure dash (U+2012) 151 | t.is(transliterate('horizontal―bar'), 'horizontal-bar'); // Horizontal bar (U+2015) 152 | t.is(transliterate('swung⁓dash'), 'swung-dash'); // Swung dash (U+2053) 153 | t.is(transliterate('two⸺em⸻dash'), 'two-em-dash'); // Two-em dash (U+2E3A) and Three-em dash (U+2E3B) 154 | 155 | // Combined test 156 | t.is(transliterate('test–with—various−dashes‒here'), 'test-with-various-dashes-here'); 157 | }); 158 | 159 | test('locale option for language-specific transliteration', t => { 160 | // Swedish 161 | t.is(transliterate('Sju sjösjuka sjömän', {locale: 'sv'}), 'Sju sjosjuka sjoman'); 162 | t.is(transliterate('Räksmörgås', {locale: 'sv'}), 'Raksmorgas'); 163 | t.is(transliterate('Räksmörgås', {locale: 'sv-SE'}), 'Raksmorgas'); // Full locale tag 164 | 165 | // German (default behavior) 166 | t.is(transliterate('Räksmörgås', {locale: 'de'}), 'Raeksmoergas'); 167 | t.is(transliterate('Räksmörgås'), 'Raeksmoergas'); // Without locale, uses default 168 | 169 | // Danish 170 | t.is(transliterate('Rød grød med fløde', {locale: 'da'}), 'Roed groed med floede'); 171 | t.is(transliterate('Blåbærsyltetøj', {locale: 'da'}), 'Blaabaersyltetoej'); 172 | 173 | // Norwegian 174 | t.is(transliterate('Rød grød med fløde', {locale: 'no'}), 'Roed groed med floede'); 175 | t.is(transliterate('Rød grød med fløde', {locale: 'nb'}), 'Roed groed med floede'); 176 | 177 | // Unknown locale falls back to default 178 | t.is(transliterate('Räksmörgås', {locale: 'unknown'}), 'Raeksmoergas'); 179 | 180 | // Custom replacements still work and take precedence 181 | t.is(transliterate('Räksmörgås', { 182 | locale: 'sv', 183 | customReplacements: [['ä', 'ae']], 184 | }), 'Raeksmorgas'); 185 | }); 186 | 187 | test('Turkish locale support - Issue #34', t => { 188 | // Turkish uses simplified transliterations compared to German 189 | t.is(transliterate('Ağır şöförlük', {locale: 'tr'}), 'Agir soforluk'); 190 | t.is(transliterate('âöü', {locale: 'tr'}), 'aou'); 191 | t.is(transliterate('ÂÖÜ', {locale: 'tr'}), 'AOU'); 192 | 193 | // Compare with German defaults 194 | t.is(transliterate('öü', {locale: 'de'}), 'oeue'); 195 | t.is(transliterate('öü'), 'oeue'); // Default behavior 196 | }); 197 | 198 | test('Latin Ō ō characters - Issue #35', t => { 199 | t.is(transliterate('Ōdor'), 'Odor'); 200 | t.is(transliterate('tōkyo'), 'tokyo'); 201 | t.is(transliterate('Tōkyō'), 'Tokyo'); 202 | }); 203 | 204 | test('Fixed (c) and (d) replacements - Issue #36', t => { 205 | t.is(transliterate('ⓒ'), '(c)'); 206 | t.is(transliterate('ⓓ'), '(d)'); 207 | }); 208 | 209 | test('Armenian ու transliteration fix - Issue #31', t => { 210 | // This was broken because ո was processed before ու 211 | t.is(transliterate('ու'), 'u'); 212 | t.is(transliterate('ՈՒ'), 'U'); 213 | t.is(transliterate('Ու'), 'U'); 214 | 215 | // Full test case from the issue 216 | t.is(transliterate('ու ՈՒ Ու'), 'u U U'); 217 | }); 218 | 219 | test('Hungarian locale support', t => { 220 | t.is(transliterate('Magyar őslakók', {locale: 'hu'}), 'Magyar oslakok'); 221 | t.is(transliterate('űű öö', {locale: 'hu'}), 'uu oo'); 222 | }); 223 | 224 | test('Serbian locale support', t => { 225 | t.is(transliterate('Ђоко џудиста', {locale: 'sr'}), 'Djoko dzudista'); 226 | t.is(transliterate('љубав њихова', {locale: 'sr'}), 'ljubav njikhova'); 227 | }); 228 | 229 | test('Azerbaijani ə and Ə support - Issue #33', t => { 230 | t.is(transliterate('ədəbiyyat'), 'adabiyyat'); 231 | t.is(transliterate('Ədəbiyyat'), 'Adabiyyat'); 232 | t.is(transliterate('məşhur'), 'mashur'); 233 | }); 234 | 235 | test('Fixed replacement mistakes - Issue #32', t => { 236 | t.is(transliterate('𝓀'), 'k'); // Was 'h' 237 | t.is(transliterate('𝕆'), 'O'); // Was 'N' 238 | }); 239 | 240 | test('French œ ligature support - Issue #7', t => { 241 | t.is(transliterate('œuf'), 'oeuf'); 242 | t.is(transliterate('Œuvre'), 'OEuvre'); 243 | t.is(transliterate('cœur'), 'coeur'); 244 | }); 245 | 246 | test('detects overlapping replacements not handled by locales', t => { 247 | // This test helps identify character conflicts that might need locale-specific handling 248 | const conflicts = []; 249 | const charMap = new Map(); 250 | 251 | // Check global replacements for duplicates 252 | for (const [char, replacement] of replacements) { 253 | if (charMap.has(char)) { 254 | const existing = charMap.get(char); 255 | if (existing !== replacement) { 256 | conflicts.push({ 257 | char, 258 | replacements: [existing, replacement], 259 | }); 260 | } 261 | } else { 262 | charMap.set(char, replacement); 263 | } 264 | } 265 | 266 | // Log conflicts for awareness 267 | if (conflicts.length > 0) { 268 | console.log(`Found ${conflicts.length} character conflicts in replacements:`); 269 | for (const c of conflicts) { 270 | console.log(` '${c.char}': [${c.replacements.join(', ')}]`); 271 | } 272 | } 273 | 274 | // The test passes if there are no conflicts 275 | t.is(conflicts.length, 0, `Found ${conflicts.length} character conflicts in replacements`); 276 | }); 277 | -------------------------------------------------------------------------------- /replacements.js: -------------------------------------------------------------------------------- 1 | const replacements = [ 2 | // German umlauts 3 | ['ß', 'ss'], 4 | ['ẞ', 'Ss'], 5 | ['ä', 'ae'], 6 | ['Ä', 'Ae'], 7 | ['ö', 'oe'], 8 | ['Ö', 'Oe'], 9 | ['ü', 'ue'], 10 | ['Ü', 'Ue'], 11 | 12 | // Latin 13 | ['À', 'A'], 14 | ['Á', 'A'], 15 | ['Â', 'A'], 16 | ['Ã', 'A'], 17 | ['Ä', 'Ae'], 18 | ['Å', 'A'], 19 | ['Æ', 'AE'], 20 | ['Ç', 'C'], 21 | ['È', 'E'], 22 | ['É', 'E'], 23 | ['Ê', 'E'], 24 | ['Ë', 'E'], 25 | ['Ə', 'A'], // Azerbaijani schwa 26 | ['Ì', 'I'], 27 | ['Í', 'I'], 28 | ['Î', 'I'], 29 | ['Ï', 'I'], 30 | ['Ð', 'D'], 31 | ['Ñ', 'N'], 32 | ['Ò', 'O'], 33 | ['Ó', 'O'], 34 | ['Ô', 'O'], 35 | ['Õ', 'O'], 36 | ['Ö', 'Oe'], 37 | ['Ō', 'O'], 38 | ['Ő', 'O'], 39 | ['Ø', 'O'], 40 | ['Œ', 'OE'], // French ligature 41 | ['Ù', 'U'], 42 | ['Ú', 'U'], 43 | ['Û', 'U'], 44 | ['Ü', 'Ue'], 45 | ['Ű', 'U'], 46 | ['Ý', 'Y'], 47 | ['Þ', 'TH'], 48 | ['ß', 'ss'], 49 | ['à', 'a'], 50 | ['á', 'a'], 51 | ['â', 'a'], 52 | ['ã', 'a'], 53 | ['ä', 'ae'], 54 | ['å', 'a'], 55 | ['æ', 'ae'], 56 | ['ç', 'c'], 57 | ['è', 'e'], 58 | ['é', 'e'], 59 | ['ê', 'e'], 60 | ['ë', 'e'], 61 | ['ə', 'a'], // Azerbaijani schwa 62 | ['ì', 'i'], 63 | ['í', 'i'], 64 | ['î', 'i'], 65 | ['ï', 'i'], 66 | ['ð', 'd'], 67 | ['ñ', 'n'], 68 | ['ò', 'o'], 69 | ['ó', 'o'], 70 | ['ô', 'o'], 71 | ['õ', 'o'], 72 | ['ö', 'oe'], 73 | ['ō', 'o'], 74 | ['ő', 'o'], 75 | ['ø', 'o'], 76 | ['œ', 'oe'], // French ligature 77 | ['ù', 'u'], 78 | ['ú', 'u'], 79 | ['û', 'u'], 80 | ['ü', 'ue'], 81 | ['ű', 'u'], 82 | ['ý', 'y'], 83 | ['þ', 'th'], 84 | ['ÿ', 'y'], 85 | 86 | // Vietnamese 87 | ['à', 'a'], 88 | ['À', 'A'], 89 | ['á', 'a'], 90 | ['Á', 'A'], 91 | ['â', 'a'], 92 | ['Â', 'A'], 93 | ['ã', 'a'], 94 | ['Ã', 'A'], 95 | ['è', 'e'], 96 | ['È', 'E'], 97 | ['é', 'e'], 98 | ['É', 'E'], 99 | ['ê', 'e'], 100 | ['Ê', 'E'], 101 | ['ì', 'i'], 102 | ['Ì', 'I'], 103 | ['í', 'i'], 104 | ['Í', 'I'], 105 | ['ò', 'o'], 106 | ['Ò', 'O'], 107 | ['ó', 'o'], 108 | ['Ó', 'O'], 109 | ['ô', 'o'], 110 | ['Ô', 'O'], 111 | ['õ', 'o'], 112 | ['Õ', 'O'], 113 | ['ù', 'u'], 114 | ['Ù', 'U'], 115 | ['ú', 'u'], 116 | ['Ú', 'U'], 117 | ['ý', 'y'], 118 | ['Ý', 'Y'], 119 | ['ă', 'a'], 120 | ['Ă', 'A'], 121 | ['Đ', 'D'], 122 | ['đ', 'd'], 123 | ['ĩ', 'i'], 124 | ['Ĩ', 'I'], 125 | ['ũ', 'u'], 126 | ['Ũ', 'U'], 127 | ['ơ', 'o'], 128 | ['Ơ', 'O'], 129 | ['ư', 'u'], 130 | ['Ư', 'U'], 131 | ['ạ', 'a'], 132 | ['Ạ', 'A'], 133 | ['ả', 'a'], 134 | ['Ả', 'A'], 135 | ['ấ', 'a'], 136 | ['Ấ', 'A'], 137 | ['ầ', 'a'], 138 | ['Ầ', 'A'], 139 | ['ẩ', 'a'], 140 | ['Ẩ', 'A'], 141 | ['ẫ', 'a'], 142 | ['Ẫ', 'A'], 143 | ['ậ', 'a'], 144 | ['Ậ', 'A'], 145 | ['ắ', 'a'], 146 | ['Ắ', 'A'], 147 | ['ằ', 'a'], 148 | ['Ằ', 'A'], 149 | ['ẳ', 'a'], 150 | ['Ẳ', 'A'], 151 | ['ẵ', 'a'], 152 | ['Ẵ', 'A'], 153 | ['ặ', 'a'], 154 | ['Ặ', 'A'], 155 | ['ẹ', 'e'], 156 | ['Ẹ', 'E'], 157 | ['ẻ', 'e'], 158 | ['Ẻ', 'E'], 159 | ['ẽ', 'e'], 160 | ['Ẽ', 'E'], 161 | ['ế', 'e'], 162 | ['Ế', 'E'], 163 | ['ề', 'e'], 164 | ['Ề', 'E'], 165 | ['ể', 'e'], 166 | ['Ể', 'E'], 167 | ['ễ', 'e'], 168 | ['Ễ', 'E'], 169 | ['ệ', 'e'], 170 | ['Ệ', 'E'], 171 | ['ỉ', 'i'], 172 | ['Ỉ', 'I'], 173 | ['ị', 'i'], 174 | ['Ị', 'I'], 175 | ['ọ', 'o'], 176 | ['Ọ', 'O'], 177 | ['ỏ', 'o'], 178 | ['Ỏ', 'O'], 179 | ['ố', 'o'], 180 | ['Ố', 'O'], 181 | ['ồ', 'o'], 182 | ['Ồ', 'O'], 183 | ['ổ', 'o'], 184 | ['Ổ', 'O'], 185 | ['ỗ', 'o'], 186 | ['Ỗ', 'O'], 187 | ['ộ', 'o'], 188 | ['Ộ', 'O'], 189 | ['ớ', 'o'], 190 | ['Ớ', 'O'], 191 | ['ờ', 'o'], 192 | ['Ờ', 'O'], 193 | ['ở', 'o'], 194 | ['Ở', 'O'], 195 | ['ỡ', 'o'], 196 | ['Ỡ', 'O'], 197 | ['ợ', 'o'], 198 | ['Ợ', 'O'], 199 | ['ụ', 'u'], 200 | ['Ụ', 'U'], 201 | ['ủ', 'u'], 202 | ['Ủ', 'U'], 203 | ['ứ', 'u'], 204 | ['Ứ', 'U'], 205 | ['ừ', 'u'], 206 | ['Ừ', 'U'], 207 | ['ử', 'u'], 208 | ['Ử', 'U'], 209 | ['ữ', 'u'], 210 | ['Ữ', 'U'], 211 | ['ự', 'u'], 212 | ['Ự', 'U'], 213 | ['ỳ', 'y'], 214 | ['Ỳ', 'Y'], 215 | ['ỵ', 'y'], 216 | ['Ỵ', 'Y'], 217 | ['ỷ', 'y'], 218 | ['Ỷ', 'Y'], 219 | ['ỹ', 'y'], 220 | ['Ỹ', 'Y'], 221 | 222 | // Arabic 223 | ['ء', 'e'], 224 | ['آ', 'a'], 225 | ['أ', 'a'], 226 | ['ؤ', 'w'], 227 | ['إ', 'a'], 228 | ['ئ', 'y'], 229 | ['ا', 'a'], 230 | ['ب', 'b'], 231 | ['ة', 't'], 232 | ['ت', 't'], 233 | ['ث', 'th'], 234 | ['ج', 'j'], 235 | ['ح', 'h'], 236 | ['خ', 'kh'], 237 | ['د', 'd'], 238 | ['ذ', 'dh'], 239 | ['ر', 'r'], 240 | ['ز', 'z'], 241 | ['س', 's'], 242 | ['ش', 'sh'], 243 | ['ص', 's'], 244 | ['ض', 'd'], 245 | ['ط', 't'], 246 | ['ظ', 'z'], 247 | ['ع', 'e'], 248 | ['غ', 'gh'], 249 | ['ـ', '_'], 250 | ['ف', 'f'], 251 | ['ق', 'q'], 252 | ['ك', 'k'], 253 | ['ل', 'l'], 254 | ['م', 'm'], 255 | ['ن', 'n'], 256 | ['ه', 'h'], 257 | ['و', 'w'], 258 | ['ى', 'a'], 259 | ['ي', 'y'], 260 | ['َ‎', 'a'], 261 | ['ُ', 'u'], 262 | ['ِ‎', 'i'], 263 | ['٠', '0'], 264 | ['١', '1'], 265 | ['٢', '2'], 266 | ['٣', '3'], 267 | ['٤', '4'], 268 | ['٥', '5'], 269 | ['٦', '6'], 270 | ['٧', '7'], 271 | ['٨', '8'], 272 | ['٩', '9'], 273 | 274 | // Persian / Farsi 275 | ['چ', 'ch'], 276 | ['ک', 'k'], 277 | ['گ', 'g'], 278 | ['پ', 'p'], 279 | ['ژ', 'zh'], 280 | ['ی', 'y'], 281 | ['۰', '0'], 282 | ['۱', '1'], 283 | ['۲', '2'], 284 | ['۳', '3'], 285 | ['۴', '4'], 286 | ['۵', '5'], 287 | ['۶', '6'], 288 | ['۷', '7'], 289 | ['۸', '8'], 290 | ['۹', '9'], 291 | 292 | // Pashto 293 | ['ټ', 'p'], 294 | ['ځ', 'z'], 295 | ['څ', 'c'], 296 | ['ډ', 'd'], 297 | ['ﺫ', 'd'], 298 | ['ﺭ', 'r'], 299 | ['ړ', 'r'], 300 | ['ﺯ', 'z'], 301 | ['ږ', 'g'], 302 | ['ښ', 'x'], 303 | ['ګ', 'g'], 304 | ['ڼ', 'n'], 305 | ['ۀ', 'e'], 306 | ['ې', 'e'], 307 | ['ۍ', 'ai'], 308 | 309 | // Urdu 310 | ['ٹ', 't'], 311 | ['ڈ', 'd'], 312 | ['ڑ', 'r'], 313 | ['ں', 'n'], 314 | ['ہ', 'h'], 315 | ['ھ', 'h'], 316 | ['ے', 'e'], 317 | 318 | // Russian 319 | ['А', 'A'], 320 | ['а', 'a'], 321 | ['Б', 'B'], 322 | ['б', 'b'], 323 | ['В', 'V'], 324 | ['в', 'v'], 325 | ['Г', 'G'], 326 | ['г', 'g'], 327 | ['Д', 'D'], 328 | ['д', 'd'], 329 | ['ъе', 'ye'], 330 | ['Ъе', 'Ye'], 331 | ['ъЕ', 'yE'], 332 | ['ЪЕ', 'YE'], 333 | ['Е', 'E'], 334 | ['е', 'e'], 335 | ['Ё', 'Yo'], 336 | ['ё', 'yo'], 337 | ['Ж', 'Zh'], 338 | ['ж', 'zh'], 339 | ['З', 'Z'], 340 | ['з', 'z'], 341 | ['И', 'I'], 342 | ['и', 'i'], 343 | ['ый', 'iy'], 344 | ['Ый', 'Iy'], 345 | ['ЫЙ', 'IY'], 346 | ['ыЙ', 'iY'], 347 | ['Й', 'Y'], 348 | ['й', 'y'], 349 | ['К', 'K'], 350 | ['к', 'k'], 351 | ['Л', 'L'], 352 | ['л', 'l'], 353 | ['М', 'M'], 354 | ['м', 'm'], 355 | ['Н', 'N'], 356 | ['н', 'n'], 357 | ['О', 'O'], 358 | ['о', 'o'], 359 | ['П', 'P'], 360 | ['п', 'p'], 361 | ['Р', 'R'], 362 | ['р', 'r'], 363 | ['С', 'S'], 364 | ['с', 's'], 365 | ['Т', 'T'], 366 | ['т', 't'], 367 | ['У', 'U'], 368 | ['у', 'u'], 369 | ['Ф', 'F'], 370 | ['ф', 'f'], 371 | ['Х', 'Kh'], 372 | ['х', 'kh'], 373 | ['Ц', 'Ts'], 374 | ['ц', 'ts'], 375 | ['Ч', 'Ch'], 376 | ['ч', 'ch'], 377 | ['Ш', 'Sh'], 378 | ['ш', 'sh'], 379 | ['Щ', 'Sch'], 380 | ['щ', 'sch'], 381 | ['Ъ', ''], 382 | ['ъ', ''], 383 | ['Ы', 'Y'], 384 | ['ы', 'y'], 385 | ['Ь', ''], 386 | ['ь', ''], 387 | ['Э', 'E'], 388 | ['э', 'e'], 389 | ['Ю', 'Yu'], 390 | ['ю', 'yu'], 391 | ['Я', 'Ya'], 392 | ['я', 'ya'], 393 | 394 | // Romanian 395 | ['ă', 'a'], 396 | ['Ă', 'A'], 397 | ['ș', 's'], 398 | ['Ș', 'S'], 399 | ['ț', 't'], 400 | ['Ț', 'T'], 401 | ['ţ', 't'], 402 | ['Ţ', 'T'], 403 | 404 | // Turkish 405 | ['ş', 's'], 406 | ['Ş', 'S'], 407 | ['ç', 'c'], 408 | ['Ç', 'C'], 409 | ['ğ', 'g'], 410 | ['Ğ', 'G'], 411 | ['ı', 'i'], 412 | ['İ', 'I'], 413 | 414 | // Armenian 415 | ['ա', 'a'], 416 | ['Ա', 'A'], 417 | ['բ', 'b'], 418 | ['Բ', 'B'], 419 | ['գ', 'g'], 420 | ['Գ', 'G'], 421 | ['դ', 'd'], 422 | ['Դ', 'D'], 423 | ['ե', 'ye'], 424 | ['Ե', 'Ye'], 425 | ['զ', 'z'], 426 | ['Զ', 'Z'], 427 | ['է', 'e'], 428 | ['Է', 'E'], 429 | ['ը', 'y'], 430 | ['Ը', 'Y'], 431 | ['թ', 't'], 432 | ['Թ', 'T'], 433 | ['ժ', 'zh'], 434 | ['Ժ', 'Zh'], 435 | ['ի', 'i'], 436 | ['Ի', 'I'], 437 | ['լ', 'l'], 438 | ['Լ', 'L'], 439 | ['խ', 'kh'], 440 | ['Խ', 'Kh'], 441 | ['ծ', 'ts'], 442 | ['Ծ', 'Ts'], 443 | ['կ', 'k'], 444 | ['Կ', 'K'], 445 | ['հ', 'h'], 446 | ['Հ', 'H'], 447 | ['ձ', 'dz'], 448 | ['Ձ', 'Dz'], 449 | ['ղ', 'gh'], 450 | ['Ղ', 'Gh'], 451 | ['ճ', 'tch'], 452 | ['Ճ', 'Tch'], 453 | ['մ', 'm'], 454 | ['Մ', 'M'], 455 | ['յ', 'y'], 456 | ['Յ', 'Y'], 457 | ['ն', 'n'], 458 | ['Ն', 'N'], 459 | ['շ', 'sh'], 460 | ['Շ', 'Sh'], 461 | // NOTE: Longer Armenian sequences must come before shorter ones 462 | ['ու', 'u'], 463 | ['ՈՒ', 'U'], 464 | ['Ու', 'U'], 465 | ['ո', 'vo'], 466 | ['Ո', 'Vo'], 467 | ['չ', 'ch'], 468 | ['Չ', 'Ch'], 469 | ['պ', 'p'], 470 | ['Պ', 'P'], 471 | ['ջ', 'j'], 472 | ['Ջ', 'J'], 473 | ['ռ', 'r'], 474 | ['Ռ', 'R'], 475 | ['ս', 's'], 476 | ['Ս', 'S'], 477 | ['վ', 'v'], 478 | ['Վ', 'V'], 479 | ['տ', 't'], 480 | ['Տ', 'T'], 481 | ['ր', 'r'], 482 | ['Ր', 'R'], 483 | ['ց', 'c'], 484 | ['Ց', 'C'], 485 | ['փ', 'p'], 486 | ['Փ', 'P'], 487 | ['ք', 'q'], 488 | ['Ք', 'Q'], 489 | ['օ', 'o'], 490 | ['Օ', 'O'], 491 | ['ֆ', 'f'], 492 | ['Ֆ', 'F'], 493 | ['և', 'yev'], 494 | 495 | // Georgian 496 | ['ა', 'a'], 497 | ['ბ', 'b'], 498 | ['გ', 'g'], 499 | ['დ', 'd'], 500 | ['ე', 'e'], 501 | ['ვ', 'v'], 502 | ['ზ', 'z'], 503 | ['თ', 't'], 504 | ['ი', 'i'], 505 | ['კ', 'k'], 506 | ['ლ', 'l'], 507 | ['მ', 'm'], 508 | ['ნ', 'n'], 509 | ['ო', 'o'], 510 | ['პ', 'p'], 511 | ['ჟ', 'zh'], 512 | ['რ', 'r'], 513 | ['ს', 's'], 514 | ['ტ', 't'], 515 | ['უ', 'u'], 516 | ['ფ', 'ph'], 517 | ['ქ', 'q'], 518 | ['ღ', 'gh'], 519 | ['ყ', 'k'], 520 | ['შ', 'sh'], 521 | ['ჩ', 'ch'], 522 | ['ც', 'ts'], 523 | ['ძ', 'dz'], 524 | ['წ', 'ts'], 525 | ['ჭ', 'tch'], 526 | ['ხ', 'kh'], 527 | ['ჯ', 'j'], 528 | ['ჰ', 'h'], 529 | 530 | // Czech 531 | ['č', 'c'], 532 | ['ď', 'd'], 533 | ['ě', 'e'], 534 | ['ň', 'n'], 535 | ['ř', 'r'], 536 | ['š', 's'], 537 | ['ť', 't'], 538 | ['ů', 'u'], 539 | ['ž', 'z'], 540 | ['Č', 'C'], 541 | ['Ď', 'D'], 542 | ['Ě', 'E'], 543 | ['Ň', 'N'], 544 | ['Ř', 'R'], 545 | ['Š', 'S'], 546 | ['Ť', 'T'], 547 | ['Ů', 'U'], 548 | ['Ž', 'Z'], 549 | 550 | // Dhivehi 551 | ['ހ', 'h'], 552 | ['ށ', 'sh'], 553 | ['ނ', 'n'], 554 | ['ރ', 'r'], 555 | ['ބ', 'b'], 556 | ['ޅ', 'lh'], 557 | ['ކ', 'k'], 558 | ['އ', 'a'], 559 | ['ވ', 'v'], 560 | ['މ', 'm'], 561 | ['ފ', 'f'], 562 | ['ދ', 'dh'], 563 | ['ތ', 'th'], 564 | ['ލ', 'l'], 565 | ['ގ', 'g'], 566 | ['ޏ', 'gn'], 567 | ['ސ', 's'], 568 | ['ޑ', 'd'], 569 | ['ޒ', 'z'], 570 | ['ޓ', 't'], 571 | ['ޔ', 'y'], 572 | ['ޕ', 'p'], 573 | ['ޖ', 'j'], 574 | ['ޗ', 'ch'], 575 | ['ޘ', 'tt'], 576 | ['ޙ', 'hh'], 577 | ['ޚ', 'kh'], 578 | ['ޛ', 'th'], 579 | ['ޜ', 'z'], 580 | ['ޝ', 'sh'], 581 | ['ޞ', 's'], 582 | ['ޟ', 'd'], 583 | ['ޠ', 't'], 584 | ['ޡ', 'z'], 585 | ['ޢ', 'a'], 586 | ['ޣ', 'gh'], 587 | ['ޤ', 'q'], 588 | ['ޥ', 'w'], 589 | ['ަ', 'a'], 590 | ['ާ', 'aa'], 591 | ['ި', 'i'], 592 | ['ީ', 'ee'], 593 | ['ު', 'u'], 594 | ['ޫ', 'oo'], 595 | ['ެ', 'e'], 596 | ['ޭ', 'ey'], 597 | ['ޮ', 'o'], 598 | ['ޯ', 'oa'], 599 | ['ް', ''], 600 | 601 | // Greek 602 | ['α', 'a'], 603 | ['β', 'v'], 604 | ['γ', 'g'], 605 | ['δ', 'd'], 606 | ['ε', 'e'], 607 | ['ζ', 'z'], 608 | ['η', 'i'], 609 | ['θ', 'th'], 610 | ['ι', 'i'], 611 | ['κ', 'k'], 612 | ['λ', 'l'], 613 | ['μ', 'm'], 614 | ['ν', 'n'], 615 | ['ξ', 'ks'], 616 | ['ο', 'o'], 617 | ['π', 'p'], 618 | ['ρ', 'r'], 619 | ['σ', 's'], 620 | ['τ', 't'], 621 | ['υ', 'y'], 622 | ['φ', 'f'], 623 | ['χ', 'x'], 624 | ['ψ', 'ps'], 625 | ['ω', 'o'], 626 | ['ά', 'a'], 627 | ['έ', 'e'], 628 | ['ί', 'i'], 629 | ['ό', 'o'], 630 | ['ύ', 'y'], 631 | ['ή', 'i'], 632 | ['ώ', 'o'], 633 | ['ς', 's'], 634 | ['ϊ', 'i'], 635 | ['ΰ', 'y'], 636 | ['ϋ', 'y'], 637 | ['ΐ', 'i'], 638 | ['Α', 'A'], 639 | ['Β', 'B'], 640 | ['Γ', 'G'], 641 | ['Δ', 'D'], 642 | ['Ε', 'E'], 643 | ['Ζ', 'Z'], 644 | ['Η', 'I'], 645 | ['Θ', 'TH'], 646 | ['Ι', 'I'], 647 | ['Κ', 'K'], 648 | ['Λ', 'L'], 649 | ['Μ', 'M'], 650 | ['Ν', 'N'], 651 | ['Ξ', 'KS'], 652 | ['Ο', 'O'], 653 | ['Π', 'P'], 654 | ['Ρ', 'R'], 655 | ['Σ', 'S'], 656 | ['Τ', 'T'], 657 | ['Υ', 'Y'], 658 | ['Φ', 'F'], 659 | ['Χ', 'X'], 660 | ['Ψ', 'PS'], 661 | ['Ω', 'O'], 662 | ['Ά', 'A'], 663 | ['Έ', 'E'], 664 | ['Ί', 'I'], 665 | ['Ό', 'O'], 666 | ['Ύ', 'Y'], 667 | ['Ή', 'I'], 668 | ['Ώ', 'O'], 669 | ['Ϊ', 'I'], 670 | ['Ϋ', 'Y'], 671 | 672 | // Disabled as it conflicts with German and Latin. 673 | // Hungarian 674 | // ['ä', 'a'], 675 | // ['Ä', 'A'], 676 | // ['ö', 'o'], 677 | // ['Ö', 'O'], 678 | // ['ü', 'u'], 679 | // ['Ü', 'U'], 680 | // ['ű', 'u'], 681 | // ['Ű', 'U'], 682 | 683 | // Latvian 684 | ['ā', 'a'], 685 | ['ē', 'e'], 686 | ['ģ', 'g'], 687 | ['ī', 'i'], 688 | ['ķ', 'k'], 689 | ['ļ', 'l'], 690 | ['ņ', 'n'], 691 | ['ū', 'u'], 692 | ['Ā', 'A'], 693 | ['Ē', 'E'], 694 | ['Ģ', 'G'], 695 | ['Ī', 'I'], 696 | ['Ķ', 'K'], 697 | ['Ļ', 'L'], 698 | ['Ņ', 'N'], 699 | ['Ū', 'U'], 700 | ['č', 'c'], 701 | ['š', 's'], 702 | ['ž', 'z'], 703 | ['Č', 'C'], 704 | ['Š', 'S'], 705 | ['Ž', 'Z'], 706 | 707 | // Lithuanian 708 | ['ą', 'a'], 709 | ['č', 'c'], 710 | ['ę', 'e'], 711 | ['ė', 'e'], 712 | ['į', 'i'], 713 | ['š', 's'], 714 | ['ų', 'u'], 715 | ['ū', 'u'], 716 | ['ž', 'z'], 717 | ['Ą', 'A'], 718 | ['Č', 'C'], 719 | ['Ę', 'E'], 720 | ['Ė', 'E'], 721 | ['Į', 'I'], 722 | ['Š', 'S'], 723 | ['Ų', 'U'], 724 | ['Ū', 'U'], 725 | 726 | // Macedonian 727 | ['Ќ', 'Kj'], 728 | ['ќ', 'kj'], 729 | ['Љ', 'Lj'], 730 | ['љ', 'lj'], 731 | ['Њ', 'Nj'], 732 | ['њ', 'nj'], 733 | ['Тс', 'Ts'], 734 | ['тс', 'ts'], 735 | 736 | // Polish 737 | ['ą', 'a'], 738 | ['ć', 'c'], 739 | ['ę', 'e'], 740 | ['ł', 'l'], 741 | ['ń', 'n'], 742 | ['ś', 's'], 743 | ['ź', 'z'], 744 | ['ż', 'z'], 745 | ['Ą', 'A'], 746 | ['Ć', 'C'], 747 | ['Ę', 'E'], 748 | ['Ł', 'L'], 749 | ['Ń', 'N'], 750 | ['Ś', 'S'], 751 | ['Ź', 'Z'], 752 | ['Ż', 'Z'], 753 | 754 | // Disabled as it conflicts with Vietnamese. 755 | // Serbian 756 | // ['љ', 'lj'], 757 | // ['њ', 'nj'], 758 | // ['Љ', 'Lj'], 759 | // ['Њ', 'Nj'], 760 | // ['đ', 'dj'], 761 | // ['Đ', 'Dj'], 762 | // ['ђ', 'dj'], 763 | // ['ј', 'j'], 764 | // ['ћ', 'c'], 765 | // ['џ', 'dz'], 766 | // ['Ђ', 'Dj'], 767 | // ['Ј', 'j'], 768 | // ['Ћ', 'C'], 769 | // ['Џ', 'Dz'], 770 | 771 | // Disabled as it conflicts with German and Latin. 772 | // Slovak 773 | // ['ä', 'a'], 774 | // ['Ä', 'A'], 775 | // ['ľ', 'l'], 776 | // ['ĺ', 'l'], 777 | // ['ŕ', 'r'], 778 | // ['Ľ', 'L'], 779 | // ['Ĺ', 'L'], 780 | // ['Ŕ', 'R'], 781 | 782 | // Disabled as it conflicts with German and Latin. 783 | // Swedish 784 | // ['å', 'o'], 785 | // ['Å', 'o'], 786 | // ['ä', 'a'], 787 | // ['Ä', 'A'], 788 | // ['ë', 'e'], 789 | // ['Ë', 'E'], 790 | // ['ö', 'o'], 791 | // ['Ö', 'O'], 792 | 793 | // Ukrainian 794 | ['Є', 'Ye'], 795 | ['І', 'I'], 796 | ['Ї', 'Yi'], 797 | ['Ґ', 'G'], 798 | ['є', 'ye'], 799 | ['і', 'i'], 800 | ['ї', 'yi'], 801 | ['ґ', 'g'], 802 | 803 | // Dutch 804 | ['IJ', 'IJ'], 805 | ['ij', 'ij'], 806 | 807 | // Danish 808 | // ['Æ', 'Ae'], 809 | // ['Ø', 'Oe'], 810 | // ['Å', 'Aa'], 811 | // ['æ', 'ae'], 812 | // ['ø', 'oe'], 813 | // ['å', 'aa'] 814 | 815 | // Currencies 816 | ['¢', 'c'], 817 | ['¥', 'Y'], 818 | ['߿', 'b'], 819 | ['৳', 't'], 820 | ['૱', 'Bo'], 821 | ['฿', 'B'], 822 | ['₠', 'CE'], 823 | ['₡', 'C'], 824 | ['₢', 'Cr'], 825 | ['₣', 'F'], 826 | ['₥', 'm'], 827 | ['₦', 'N'], 828 | ['₧', 'Pt'], 829 | ['₨', 'Rs'], 830 | ['₩', 'W'], 831 | ['₫', 's'], 832 | ['€', 'E'], 833 | ['₭', 'K'], 834 | ['₮', 'T'], 835 | ['₯', 'Dp'], 836 | ['₰', 'S'], 837 | ['₱', 'P'], 838 | ['₲', 'G'], 839 | ['₳', 'A'], 840 | ['₴', 'S'], 841 | ['₵', 'C'], 842 | ['₶', 'tt'], 843 | ['₷', 'S'], 844 | ['₸', 'T'], 845 | ['₹', 'R'], 846 | ['₺', 'L'], 847 | ['₽', 'P'], 848 | ['₿', 'B'], 849 | ['﹩', '$'], 850 | ['¢', 'c'], 851 | ['¥', 'Y'], 852 | ['₩', 'W'], 853 | 854 | // Latin 855 | ['𝐀', 'A'], 856 | ['𝐁', 'B'], 857 | ['𝐂', 'C'], 858 | ['𝐃', 'D'], 859 | ['𝐄', 'E'], 860 | ['𝐅', 'F'], 861 | ['𝐆', 'G'], 862 | ['𝐇', 'H'], 863 | ['𝐈', 'I'], 864 | ['𝐉', 'J'], 865 | ['𝐊', 'K'], 866 | ['𝐋', 'L'], 867 | ['𝐌', 'M'], 868 | ['𝐍', 'N'], 869 | ['𝐎', 'O'], 870 | ['𝐏', 'P'], 871 | ['𝐐', 'Q'], 872 | ['𝐑', 'R'], 873 | ['𝐒', 'S'], 874 | ['𝐓', 'T'], 875 | ['𝐔', 'U'], 876 | ['𝐕', 'V'], 877 | ['𝐖', 'W'], 878 | ['𝐗', 'X'], 879 | ['𝐘', 'Y'], 880 | ['𝐙', 'Z'], 881 | ['𝐚', 'a'], 882 | ['𝐛', 'b'], 883 | ['𝐜', 'c'], 884 | ['𝐝', 'd'], 885 | ['𝐞', 'e'], 886 | ['𝐟', 'f'], 887 | ['𝐠', 'g'], 888 | ['𝐡', 'h'], 889 | ['𝐢', 'i'], 890 | ['𝐣', 'j'], 891 | ['𝐤', 'k'], 892 | ['𝐥', 'l'], 893 | ['𝐦', 'm'], 894 | ['𝐧', 'n'], 895 | ['𝐨', 'o'], 896 | ['𝐩', 'p'], 897 | ['𝐪', 'q'], 898 | ['𝐫', 'r'], 899 | ['𝐬', 's'], 900 | ['𝐭', 't'], 901 | ['𝐮', 'u'], 902 | ['𝐯', 'v'], 903 | ['𝐰', 'w'], 904 | ['𝐱', 'x'], 905 | ['𝐲', 'y'], 906 | ['𝐳', 'z'], 907 | ['𝐴', 'A'], 908 | ['𝐵', 'B'], 909 | ['𝐶', 'C'], 910 | ['𝐷', 'D'], 911 | ['𝐸', 'E'], 912 | ['𝐹', 'F'], 913 | ['𝐺', 'G'], 914 | ['𝐻', 'H'], 915 | ['𝐼', 'I'], 916 | ['𝐽', 'J'], 917 | ['𝐾', 'K'], 918 | ['𝐿', 'L'], 919 | ['𝑀', 'M'], 920 | ['𝑁', 'N'], 921 | ['𝑂', 'O'], 922 | ['𝑃', 'P'], 923 | ['𝑄', 'Q'], 924 | ['𝑅', 'R'], 925 | ['𝑆', 'S'], 926 | ['𝑇', 'T'], 927 | ['𝑈', 'U'], 928 | ['𝑉', 'V'], 929 | ['𝑊', 'W'], 930 | ['𝑋', 'X'], 931 | ['𝑌', 'Y'], 932 | ['𝑍', 'Z'], 933 | ['𝑎', 'a'], 934 | ['𝑏', 'b'], 935 | ['𝑐', 'c'], 936 | ['𝑑', 'd'], 937 | ['𝑒', 'e'], 938 | ['𝑓', 'f'], 939 | ['𝑔', 'g'], 940 | ['𝑖', 'i'], 941 | ['𝑗', 'j'], 942 | ['𝑘', 'k'], 943 | ['𝑙', 'l'], 944 | ['𝑚', 'm'], 945 | ['𝑛', 'n'], 946 | ['𝑜', 'o'], 947 | ['𝑝', 'p'], 948 | ['𝑞', 'q'], 949 | ['𝑟', 'r'], 950 | ['𝑠', 's'], 951 | ['𝑡', 't'], 952 | ['𝑢', 'u'], 953 | ['𝑣', 'v'], 954 | ['𝑤', 'w'], 955 | ['𝑥', 'x'], 956 | ['𝑦', 'y'], 957 | ['𝑧', 'z'], 958 | ['𝑨', 'A'], 959 | ['𝑩', 'B'], 960 | ['𝑪', 'C'], 961 | ['𝑫', 'D'], 962 | ['𝑬', 'E'], 963 | ['𝑭', 'F'], 964 | ['𝑮', 'G'], 965 | ['𝑯', 'H'], 966 | ['𝑰', 'I'], 967 | ['𝑱', 'J'], 968 | ['𝑲', 'K'], 969 | ['𝑳', 'L'], 970 | ['𝑴', 'M'], 971 | ['𝑵', 'N'], 972 | ['𝑶', 'O'], 973 | ['𝑷', 'P'], 974 | ['𝑸', 'Q'], 975 | ['𝑹', 'R'], 976 | ['𝑺', 'S'], 977 | ['𝑻', 'T'], 978 | ['𝑼', 'U'], 979 | ['𝑽', 'V'], 980 | ['𝑾', 'W'], 981 | ['𝑿', 'X'], 982 | ['𝒀', 'Y'], 983 | ['𝒁', 'Z'], 984 | ['𝒂', 'a'], 985 | ['𝒃', 'b'], 986 | ['𝒄', 'c'], 987 | ['𝒅', 'd'], 988 | ['𝒆', 'e'], 989 | ['𝒇', 'f'], 990 | ['𝒈', 'g'], 991 | ['𝒉', 'h'], 992 | ['𝒊', 'i'], 993 | ['𝒋', 'j'], 994 | ['𝒌', 'k'], 995 | ['𝒍', 'l'], 996 | ['𝒎', 'm'], 997 | ['𝒏', 'n'], 998 | ['𝒐', 'o'], 999 | ['𝒑', 'p'], 1000 | ['𝒒', 'q'], 1001 | ['𝒓', 'r'], 1002 | ['𝒔', 's'], 1003 | ['𝒕', 't'], 1004 | ['𝒖', 'u'], 1005 | ['𝒗', 'v'], 1006 | ['𝒘', 'w'], 1007 | ['𝒙', 'x'], 1008 | ['𝒚', 'y'], 1009 | ['𝒛', 'z'], 1010 | ['𝒜', 'A'], 1011 | ['𝒞', 'C'], 1012 | ['𝒟', 'D'], 1013 | ['𝒢', 'g'], 1014 | ['𝒥', 'J'], 1015 | ['𝒦', 'K'], 1016 | ['𝒩', 'N'], 1017 | ['𝒪', 'O'], 1018 | ['𝒫', 'P'], 1019 | ['𝒬', 'Q'], 1020 | ['𝒮', 'S'], 1021 | ['𝒯', 'T'], 1022 | ['𝒰', 'U'], 1023 | ['𝒱', 'V'], 1024 | ['𝒲', 'W'], 1025 | ['𝒳', 'X'], 1026 | ['𝒴', 'Y'], 1027 | ['𝒵', 'Z'], 1028 | ['𝒶', 'a'], 1029 | ['𝒷', 'b'], 1030 | ['𝒸', 'c'], 1031 | ['𝒹', 'd'], 1032 | ['𝒻', 'f'], 1033 | ['𝒽', 'h'], 1034 | ['𝒾', 'i'], 1035 | ['𝒿', 'j'], 1036 | ['𝓀', 'k'], 1037 | ['𝓁', 'l'], 1038 | ['𝓂', 'm'], 1039 | ['𝓃', 'n'], 1040 | ['𝓅', 'p'], 1041 | ['𝓆', 'q'], 1042 | ['𝓇', 'r'], 1043 | ['𝓈', 's'], 1044 | ['𝓉', 't'], 1045 | ['𝓊', 'u'], 1046 | ['𝓋', 'v'], 1047 | ['𝓌', 'w'], 1048 | ['𝓍', 'x'], 1049 | ['𝓎', 'y'], 1050 | ['𝓏', 'z'], 1051 | ['𝓐', 'A'], 1052 | ['𝓑', 'B'], 1053 | ['𝓒', 'C'], 1054 | ['𝓓', 'D'], 1055 | ['𝓔', 'E'], 1056 | ['𝓕', 'F'], 1057 | ['𝓖', 'G'], 1058 | ['𝓗', 'H'], 1059 | ['𝓘', 'I'], 1060 | ['𝓙', 'J'], 1061 | ['𝓚', 'K'], 1062 | ['𝓛', 'L'], 1063 | ['𝓜', 'M'], 1064 | ['𝓝', 'N'], 1065 | ['𝓞', 'O'], 1066 | ['𝓟', 'P'], 1067 | ['𝓠', 'Q'], 1068 | ['𝓡', 'R'], 1069 | ['𝓢', 'S'], 1070 | ['𝓣', 'T'], 1071 | ['𝓤', 'U'], 1072 | ['𝓥', 'V'], 1073 | ['𝓦', 'W'], 1074 | ['𝓧', 'X'], 1075 | ['𝓨', 'Y'], 1076 | ['𝓩', 'Z'], 1077 | ['𝓪', 'a'], 1078 | ['𝓫', 'b'], 1079 | ['𝓬', 'c'], 1080 | ['𝓭', 'd'], 1081 | ['𝓮', 'e'], 1082 | ['𝓯', 'f'], 1083 | ['𝓰', 'g'], 1084 | ['𝓱', 'h'], 1085 | ['𝓲', 'i'], 1086 | ['𝓳', 'j'], 1087 | ['𝓴', 'k'], 1088 | ['𝓵', 'l'], 1089 | ['𝓶', 'm'], 1090 | ['𝓷', 'n'], 1091 | ['𝓸', 'o'], 1092 | ['𝓹', 'p'], 1093 | ['𝓺', 'q'], 1094 | ['𝓻', 'r'], 1095 | ['𝓼', 's'], 1096 | ['𝓽', 't'], 1097 | ['𝓾', 'u'], 1098 | ['𝓿', 'v'], 1099 | ['𝔀', 'w'], 1100 | ['𝔁', 'x'], 1101 | ['𝔂', 'y'], 1102 | ['𝔃', 'z'], 1103 | ['𝔄', 'A'], 1104 | ['𝔅', 'B'], 1105 | ['𝔇', 'D'], 1106 | ['𝔈', 'E'], 1107 | ['𝔉', 'F'], 1108 | ['𝔊', 'G'], 1109 | ['𝔍', 'J'], 1110 | ['𝔎', 'K'], 1111 | ['𝔏', 'L'], 1112 | ['𝔐', 'M'], 1113 | ['𝔑', 'N'], 1114 | ['𝔒', 'O'], 1115 | ['𝔓', 'P'], 1116 | ['𝔔', 'Q'], 1117 | ['𝔖', 'S'], 1118 | ['𝔗', 'T'], 1119 | ['𝔘', 'U'], 1120 | ['𝔙', 'V'], 1121 | ['𝔚', 'W'], 1122 | ['𝔛', 'X'], 1123 | ['𝔜', 'Y'], 1124 | ['𝔞', 'a'], 1125 | ['𝔟', 'b'], 1126 | ['𝔠', 'c'], 1127 | ['𝔡', 'd'], 1128 | ['𝔢', 'e'], 1129 | ['𝔣', 'f'], 1130 | ['𝔤', 'g'], 1131 | ['𝔥', 'h'], 1132 | ['𝔦', 'i'], 1133 | ['𝔧', 'j'], 1134 | ['𝔨', 'k'], 1135 | ['𝔩', 'l'], 1136 | ['𝔪', 'm'], 1137 | ['𝔫', 'n'], 1138 | ['𝔬', 'o'], 1139 | ['𝔭', 'p'], 1140 | ['𝔮', 'q'], 1141 | ['𝔯', 'r'], 1142 | ['𝔰', 's'], 1143 | ['𝔱', 't'], 1144 | ['𝔲', 'u'], 1145 | ['𝔳', 'v'], 1146 | ['𝔴', 'w'], 1147 | ['𝔵', 'x'], 1148 | ['𝔶', 'y'], 1149 | ['𝔷', 'z'], 1150 | ['𝔸', 'A'], 1151 | ['𝔹', 'B'], 1152 | ['𝔻', 'D'], 1153 | ['𝔼', 'E'], 1154 | ['𝔽', 'F'], 1155 | ['𝔾', 'G'], 1156 | ['𝕀', 'I'], 1157 | ['𝕁', 'J'], 1158 | ['𝕂', 'K'], 1159 | ['𝕃', 'L'], 1160 | ['𝕄', 'M'], 1161 | ['𝕆', 'O'], 1162 | ['𝕊', 'S'], 1163 | ['𝕋', 'T'], 1164 | ['𝕌', 'U'], 1165 | ['𝕍', 'V'], 1166 | ['𝕎', 'W'], 1167 | ['𝕏', 'X'], 1168 | ['𝕐', 'Y'], 1169 | ['𝕒', 'a'], 1170 | ['𝕓', 'b'], 1171 | ['𝕔', 'c'], 1172 | ['𝕕', 'd'], 1173 | ['𝕖', 'e'], 1174 | ['𝕗', 'f'], 1175 | ['𝕘', 'g'], 1176 | ['𝕙', 'h'], 1177 | ['𝕚', 'i'], 1178 | ['𝕛', 'j'], 1179 | ['𝕜', 'k'], 1180 | ['𝕝', 'l'], 1181 | ['𝕞', 'm'], 1182 | ['𝕟', 'n'], 1183 | ['𝕠', 'o'], 1184 | ['𝕡', 'p'], 1185 | ['𝕢', 'q'], 1186 | ['𝕣', 'r'], 1187 | ['𝕤', 's'], 1188 | ['𝕥', 't'], 1189 | ['𝕦', 'u'], 1190 | ['𝕧', 'v'], 1191 | ['𝕨', 'w'], 1192 | ['𝕩', 'x'], 1193 | ['𝕪', 'y'], 1194 | ['𝕫', 'z'], 1195 | ['𝕬', 'A'], 1196 | ['𝕭', 'B'], 1197 | ['𝕮', 'C'], 1198 | ['𝕯', 'D'], 1199 | ['𝕰', 'E'], 1200 | ['𝕱', 'F'], 1201 | ['𝕲', 'G'], 1202 | ['𝕳', 'H'], 1203 | ['𝕴', 'I'], 1204 | ['𝕵', 'J'], 1205 | ['𝕶', 'K'], 1206 | ['𝕷', 'L'], 1207 | ['𝕸', 'M'], 1208 | ['𝕹', 'N'], 1209 | ['𝕺', 'O'], 1210 | ['𝕻', 'P'], 1211 | ['𝕼', 'Q'], 1212 | ['𝕽', 'R'], 1213 | ['𝕾', 'S'], 1214 | ['𝕿', 'T'], 1215 | ['𝖀', 'U'], 1216 | ['𝖁', 'V'], 1217 | ['𝖂', 'W'], 1218 | ['𝖃', 'X'], 1219 | ['𝖄', 'Y'], 1220 | ['𝖅', 'Z'], 1221 | ['𝖆', 'a'], 1222 | ['𝖇', 'b'], 1223 | ['𝖈', 'c'], 1224 | ['𝖉', 'd'], 1225 | ['𝖊', 'e'], 1226 | ['𝖋', 'f'], 1227 | ['𝖌', 'g'], 1228 | ['𝖍', 'h'], 1229 | ['𝖎', 'i'], 1230 | ['𝖏', 'j'], 1231 | ['𝖐', 'k'], 1232 | ['𝖑', 'l'], 1233 | ['𝖒', 'm'], 1234 | ['𝖓', 'n'], 1235 | ['𝖔', 'o'], 1236 | ['𝖕', 'p'], 1237 | ['𝖖', 'q'], 1238 | ['𝖗', 'r'], 1239 | ['𝖘', 's'], 1240 | ['𝖙', 't'], 1241 | ['𝖚', 'u'], 1242 | ['𝖛', 'v'], 1243 | ['𝖜', 'w'], 1244 | ['𝖝', 'x'], 1245 | ['𝖞', 'y'], 1246 | ['𝖟', 'z'], 1247 | ['𝖠', 'A'], 1248 | ['𝖡', 'B'], 1249 | ['𝖢', 'C'], 1250 | ['𝖣', 'D'], 1251 | ['𝖤', 'E'], 1252 | ['𝖥', 'F'], 1253 | ['𝖦', 'G'], 1254 | ['𝖧', 'H'], 1255 | ['𝖨', 'I'], 1256 | ['𝖩', 'J'], 1257 | ['𝖪', 'K'], 1258 | ['𝖫', 'L'], 1259 | ['𝖬', 'M'], 1260 | ['𝖭', 'N'], 1261 | ['𝖮', 'O'], 1262 | ['𝖯', 'P'], 1263 | ['𝖰', 'Q'], 1264 | ['𝖱', 'R'], 1265 | ['𝖲', 'S'], 1266 | ['𝖳', 'T'], 1267 | ['𝖴', 'U'], 1268 | ['𝖵', 'V'], 1269 | ['𝖶', 'W'], 1270 | ['𝖷', 'X'], 1271 | ['𝖸', 'Y'], 1272 | ['𝖹', 'Z'], 1273 | ['𝖺', 'a'], 1274 | ['𝖻', 'b'], 1275 | ['𝖼', 'c'], 1276 | ['𝖽', 'd'], 1277 | ['𝖾', 'e'], 1278 | ['𝖿', 'f'], 1279 | ['𝗀', 'g'], 1280 | ['𝗁', 'h'], 1281 | ['𝗂', 'i'], 1282 | ['𝗃', 'j'], 1283 | ['𝗄', 'k'], 1284 | ['𝗅', 'l'], 1285 | ['𝗆', 'm'], 1286 | ['𝗇', 'n'], 1287 | ['𝗈', 'o'], 1288 | ['𝗉', 'p'], 1289 | ['𝗊', 'q'], 1290 | ['𝗋', 'r'], 1291 | ['𝗌', 's'], 1292 | ['𝗍', 't'], 1293 | ['𝗎', 'u'], 1294 | ['𝗏', 'v'], 1295 | ['𝗐', 'w'], 1296 | ['𝗑', 'x'], 1297 | ['𝗒', 'y'], 1298 | ['𝗓', 'z'], 1299 | ['𝗔', 'A'], 1300 | ['𝗕', 'B'], 1301 | ['𝗖', 'C'], 1302 | ['𝗗', 'D'], 1303 | ['𝗘', 'E'], 1304 | ['𝗙', 'F'], 1305 | ['𝗚', 'G'], 1306 | ['𝗛', 'H'], 1307 | ['𝗜', 'I'], 1308 | ['𝗝', 'J'], 1309 | ['𝗞', 'K'], 1310 | ['𝗟', 'L'], 1311 | ['𝗠', 'M'], 1312 | ['𝗡', 'N'], 1313 | ['𝗢', 'O'], 1314 | ['𝗣', 'P'], 1315 | ['𝗤', 'Q'], 1316 | ['𝗥', 'R'], 1317 | ['𝗦', 'S'], 1318 | ['𝗧', 'T'], 1319 | ['𝗨', 'U'], 1320 | ['𝗩', 'V'], 1321 | ['𝗪', 'W'], 1322 | ['𝗫', 'X'], 1323 | ['𝗬', 'Y'], 1324 | ['𝗭', 'Z'], 1325 | ['𝗮', 'a'], 1326 | ['𝗯', 'b'], 1327 | ['𝗰', 'c'], 1328 | ['𝗱', 'd'], 1329 | ['𝗲', 'e'], 1330 | ['𝗳', 'f'], 1331 | ['𝗴', 'g'], 1332 | ['𝗵', 'h'], 1333 | ['𝗶', 'i'], 1334 | ['𝗷', 'j'], 1335 | ['𝗸', 'k'], 1336 | ['𝗹', 'l'], 1337 | ['𝗺', 'm'], 1338 | ['𝗻', 'n'], 1339 | ['𝗼', 'o'], 1340 | ['𝗽', 'p'], 1341 | ['𝗾', 'q'], 1342 | ['𝗿', 'r'], 1343 | ['𝘀', 's'], 1344 | ['𝘁', 't'], 1345 | ['𝘂', 'u'], 1346 | ['𝘃', 'v'], 1347 | ['𝘄', 'w'], 1348 | ['𝘅', 'x'], 1349 | ['𝘆', 'y'], 1350 | ['𝘇', 'z'], 1351 | ['𝘈', 'A'], 1352 | ['𝘉', 'B'], 1353 | ['𝘊', 'C'], 1354 | ['𝘋', 'D'], 1355 | ['𝘌', 'E'], 1356 | ['𝘍', 'F'], 1357 | ['𝘎', 'G'], 1358 | ['𝘏', 'H'], 1359 | ['𝘐', 'I'], 1360 | ['𝘑', 'J'], 1361 | ['𝘒', 'K'], 1362 | ['𝘓', 'L'], 1363 | ['𝘔', 'M'], 1364 | ['𝘕', 'N'], 1365 | ['𝘖', 'O'], 1366 | ['𝘗', 'P'], 1367 | ['𝘘', 'Q'], 1368 | ['𝘙', 'R'], 1369 | ['𝘚', 'S'], 1370 | ['𝘛', 'T'], 1371 | ['𝘜', 'U'], 1372 | ['𝘝', 'V'], 1373 | ['𝘞', 'W'], 1374 | ['𝘟', 'X'], 1375 | ['𝘠', 'Y'], 1376 | ['𝘡', 'Z'], 1377 | ['𝘢', 'a'], 1378 | ['𝘣', 'b'], 1379 | ['𝘤', 'c'], 1380 | ['𝘥', 'd'], 1381 | ['𝘦', 'e'], 1382 | ['𝘧', 'f'], 1383 | ['𝘨', 'g'], 1384 | ['𝘩', 'h'], 1385 | ['𝘪', 'i'], 1386 | ['𝘫', 'j'], 1387 | ['𝘬', 'k'], 1388 | ['𝘭', 'l'], 1389 | ['𝘮', 'm'], 1390 | ['𝘯', 'n'], 1391 | ['𝘰', 'o'], 1392 | ['𝘱', 'p'], 1393 | ['𝘲', 'q'], 1394 | ['𝘳', 'r'], 1395 | ['𝘴', 's'], 1396 | ['𝘵', 't'], 1397 | ['𝘶', 'u'], 1398 | ['𝘷', 'v'], 1399 | ['𝘸', 'w'], 1400 | ['𝘹', 'x'], 1401 | ['𝘺', 'y'], 1402 | ['𝘻', 'z'], 1403 | ['𝘼', 'A'], 1404 | ['𝘽', 'B'], 1405 | ['𝘾', 'C'], 1406 | ['𝘿', 'D'], 1407 | ['𝙀', 'E'], 1408 | ['𝙁', 'F'], 1409 | ['𝙂', 'G'], 1410 | ['𝙃', 'H'], 1411 | ['𝙄', 'I'], 1412 | ['𝙅', 'J'], 1413 | ['𝙆', 'K'], 1414 | ['𝙇', 'L'], 1415 | ['𝙈', 'M'], 1416 | ['𝙉', 'N'], 1417 | ['𝙊', 'O'], 1418 | ['𝙋', 'P'], 1419 | ['𝙌', 'Q'], 1420 | ['𝙍', 'R'], 1421 | ['𝙎', 'S'], 1422 | ['𝙏', 'T'], 1423 | ['𝙐', 'U'], 1424 | ['𝙑', 'V'], 1425 | ['𝙒', 'W'], 1426 | ['𝙓', 'X'], 1427 | ['𝙔', 'Y'], 1428 | ['𝙕', 'Z'], 1429 | ['𝙖', 'a'], 1430 | ['𝙗', 'b'], 1431 | ['𝙘', 'c'], 1432 | ['𝙙', 'd'], 1433 | ['𝙚', 'e'], 1434 | ['𝙛', 'f'], 1435 | ['𝙜', 'g'], 1436 | ['𝙝', 'h'], 1437 | ['𝙞', 'i'], 1438 | ['𝙟', 'j'], 1439 | ['𝙠', 'k'], 1440 | ['𝙡', 'l'], 1441 | ['𝙢', 'm'], 1442 | ['𝙣', 'n'], 1443 | ['𝙤', 'o'], 1444 | ['𝙥', 'p'], 1445 | ['𝙦', 'q'], 1446 | ['𝙧', 'r'], 1447 | ['𝙨', 's'], 1448 | ['𝙩', 't'], 1449 | ['𝙪', 'u'], 1450 | ['𝙫', 'v'], 1451 | ['𝙬', 'w'], 1452 | ['𝙭', 'x'], 1453 | ['𝙮', 'y'], 1454 | ['𝙯', 'z'], 1455 | ['𝙰', 'A'], 1456 | ['𝙱', 'B'], 1457 | ['𝙲', 'C'], 1458 | ['𝙳', 'D'], 1459 | ['𝙴', 'E'], 1460 | ['𝙵', 'F'], 1461 | ['𝙶', 'G'], 1462 | ['𝙷', 'H'], 1463 | ['𝙸', 'I'], 1464 | ['𝙹', 'J'], 1465 | ['𝙺', 'K'], 1466 | ['𝙻', 'L'], 1467 | ['𝙼', 'M'], 1468 | ['𝙽', 'N'], 1469 | ['𝙾', 'O'], 1470 | ['𝙿', 'P'], 1471 | ['𝚀', 'Q'], 1472 | ['𝚁', 'R'], 1473 | ['𝚂', 'S'], 1474 | ['𝚃', 'T'], 1475 | ['𝚄', 'U'], 1476 | ['𝚅', 'V'], 1477 | ['𝚆', 'W'], 1478 | ['𝚇', 'X'], 1479 | ['𝚈', 'Y'], 1480 | ['𝚉', 'Z'], 1481 | ['𝚊', 'a'], 1482 | ['𝚋', 'b'], 1483 | ['𝚌', 'c'], 1484 | ['𝚍', 'd'], 1485 | ['𝚎', 'e'], 1486 | ['𝚏', 'f'], 1487 | ['𝚐', 'g'], 1488 | ['𝚑', 'h'], 1489 | ['𝚒', 'i'], 1490 | ['𝚓', 'j'], 1491 | ['𝚔', 'k'], 1492 | ['𝚕', 'l'], 1493 | ['𝚖', 'm'], 1494 | ['𝚗', 'n'], 1495 | ['𝚘', 'o'], 1496 | ['𝚙', 'p'], 1497 | ['𝚚', 'q'], 1498 | ['𝚛', 'r'], 1499 | ['𝚜', 's'], 1500 | ['𝚝', 't'], 1501 | ['𝚞', 'u'], 1502 | ['𝚟', 'v'], 1503 | ['𝚠', 'w'], 1504 | ['𝚡', 'x'], 1505 | ['𝚢', 'y'], 1506 | ['𝚣', 'z'], 1507 | 1508 | // Dotless letters 1509 | ['𝚤', 'l'], 1510 | ['𝚥', 'j'], 1511 | 1512 | // Greek 1513 | ['𝛢', 'A'], 1514 | ['𝛣', 'B'], 1515 | ['𝛤', 'G'], 1516 | ['𝛥', 'D'], 1517 | ['𝛦', 'E'], 1518 | ['𝛧', 'Z'], 1519 | ['𝛨', 'I'], 1520 | ['𝛩', 'TH'], 1521 | ['𝛪', 'I'], 1522 | ['𝛫', 'K'], 1523 | ['𝛬', 'L'], 1524 | ['𝛭', 'M'], 1525 | ['𝛮', 'N'], 1526 | ['𝛯', 'KS'], 1527 | ['𝛰', 'O'], 1528 | ['𝛱', 'P'], 1529 | ['𝛲', 'R'], 1530 | ['𝛳', 'TH'], 1531 | ['𝛴', 'S'], 1532 | ['𝛵', 'T'], 1533 | ['𝛶', 'Y'], 1534 | ['𝛷', 'F'], 1535 | ['𝛸', 'x'], 1536 | ['𝛹', 'PS'], 1537 | ['𝛺', 'O'], 1538 | ['𝛻', 'D'], 1539 | ['𝛼', 'a'], 1540 | ['𝛽', 'b'], 1541 | ['𝛾', 'g'], 1542 | ['𝛿', 'd'], 1543 | ['𝜀', 'e'], 1544 | ['𝜁', 'z'], 1545 | ['𝜂', 'i'], 1546 | ['𝜃', 'th'], 1547 | ['𝜄', 'i'], 1548 | ['𝜅', 'k'], 1549 | ['𝜆', 'l'], 1550 | ['𝜇', 'm'], 1551 | ['𝜈', 'n'], 1552 | ['𝜉', 'ks'], 1553 | ['𝜊', 'o'], 1554 | ['𝜋', 'p'], 1555 | ['𝜌', 'r'], 1556 | ['𝜍', 's'], 1557 | ['𝜎', 's'], 1558 | ['𝜏', 't'], 1559 | ['𝜐', 'y'], 1560 | ['𝜑', 'f'], 1561 | ['𝜒', 'x'], 1562 | ['𝜓', 'ps'], 1563 | ['𝜔', 'o'], 1564 | ['𝜕', 'd'], 1565 | ['𝜖', 'E'], 1566 | ['𝜗', 'TH'], 1567 | ['𝜘', 'K'], 1568 | ['𝜙', 'f'], 1569 | ['𝜚', 'r'], 1570 | ['𝜛', 'p'], 1571 | ['𝜜', 'A'], 1572 | ['𝜝', 'V'], 1573 | ['𝜞', 'G'], 1574 | ['𝜟', 'D'], 1575 | ['𝜠', 'E'], 1576 | ['𝜡', 'Z'], 1577 | ['𝜢', 'I'], 1578 | ['𝜣', 'TH'], 1579 | ['𝜤', 'I'], 1580 | ['𝜥', 'K'], 1581 | ['𝜦', 'L'], 1582 | ['𝜧', 'M'], 1583 | ['𝜨', 'N'], 1584 | ['𝜩', 'KS'], 1585 | ['𝜪', 'O'], 1586 | ['𝜫', 'P'], 1587 | ['𝜬', 'S'], 1588 | ['𝜭', 'TH'], 1589 | ['𝜮', 'S'], 1590 | ['𝜯', 'T'], 1591 | ['𝜰', 'Y'], 1592 | ['𝜱', 'F'], 1593 | ['𝜲', 'X'], 1594 | ['𝜳', 'PS'], 1595 | ['𝜴', 'O'], 1596 | ['𝜵', 'D'], 1597 | ['𝜶', 'a'], 1598 | ['𝜷', 'v'], 1599 | ['𝜸', 'g'], 1600 | ['𝜹', 'd'], 1601 | ['𝜺', 'e'], 1602 | ['𝜻', 'z'], 1603 | ['𝜼', 'i'], 1604 | ['𝜽', 'th'], 1605 | ['𝜾', 'i'], 1606 | ['𝜿', 'k'], 1607 | ['𝝀', 'l'], 1608 | ['𝝁', 'm'], 1609 | ['𝝂', 'n'], 1610 | ['𝝃', 'ks'], 1611 | ['𝝄', 'o'], 1612 | ['𝝅', 'p'], 1613 | ['𝝆', 'r'], 1614 | ['𝝇', 's'], 1615 | ['𝝈', 's'], 1616 | ['𝝉', 't'], 1617 | ['𝝊', 'y'], 1618 | ['𝝋', 'f'], 1619 | ['𝝌', 'x'], 1620 | ['𝝍', 'ps'], 1621 | ['𝝎', 'o'], 1622 | ['𝝏', 'a'], 1623 | ['𝝐', 'e'], 1624 | ['𝝑', 'i'], 1625 | ['𝝒', 'k'], 1626 | ['𝝓', 'f'], 1627 | ['𝝔', 'r'], 1628 | ['𝝕', 'p'], 1629 | ['𝝖', 'A'], 1630 | ['𝝗', 'B'], 1631 | ['𝝘', 'G'], 1632 | ['𝝙', 'D'], 1633 | ['𝝚', 'E'], 1634 | ['𝝛', 'Z'], 1635 | ['𝝜', 'I'], 1636 | ['𝝝', 'TH'], 1637 | ['𝝞', 'I'], 1638 | ['𝝟', 'K'], 1639 | ['𝝠', 'L'], 1640 | ['𝝡', 'M'], 1641 | ['𝝢', 'N'], 1642 | ['𝝣', 'KS'], 1643 | ['𝝤', 'O'], 1644 | ['𝝥', 'P'], 1645 | ['𝝦', 'R'], 1646 | ['𝝧', 'TH'], 1647 | ['𝝨', 'S'], 1648 | ['𝝩', 'T'], 1649 | ['𝝪', 'Y'], 1650 | ['𝝫', 'F'], 1651 | ['𝝬', 'X'], 1652 | ['𝝭', 'PS'], 1653 | ['𝝮', 'O'], 1654 | ['𝝯', 'D'], 1655 | ['𝝰', 'a'], 1656 | ['𝝱', 'v'], 1657 | ['𝝲', 'g'], 1658 | ['𝝳', 'd'], 1659 | ['𝝴', 'e'], 1660 | ['𝝵', 'z'], 1661 | ['𝝶', 'i'], 1662 | ['𝝷', 'th'], 1663 | ['𝝸', 'i'], 1664 | ['𝝹', 'k'], 1665 | ['𝝺', 'l'], 1666 | ['𝝻', 'm'], 1667 | ['𝝼', 'n'], 1668 | ['𝝽', 'ks'], 1669 | ['𝝾', 'o'], 1670 | ['𝝿', 'p'], 1671 | ['𝞀', 'r'], 1672 | ['𝞁', 's'], 1673 | ['𝞂', 's'], 1674 | ['𝞃', 't'], 1675 | ['𝞄', 'y'], 1676 | ['𝞅', 'f'], 1677 | ['𝞆', 'x'], 1678 | ['𝞇', 'ps'], 1679 | ['𝞈', 'o'], 1680 | ['𝞉', 'a'], 1681 | ['𝞊', 'e'], 1682 | ['𝞋', 'i'], 1683 | ['𝞌', 'k'], 1684 | ['𝞍', 'f'], 1685 | ['𝞎', 'r'], 1686 | ['𝞏', 'p'], 1687 | ['𝞐', 'A'], 1688 | ['𝞑', 'V'], 1689 | ['𝞒', 'G'], 1690 | ['𝞓', 'D'], 1691 | ['𝞔', 'E'], 1692 | ['𝞕', 'Z'], 1693 | ['𝞖', 'I'], 1694 | ['𝞗', 'TH'], 1695 | ['𝞘', 'I'], 1696 | ['𝞙', 'K'], 1697 | ['𝞚', 'L'], 1698 | ['𝞛', 'M'], 1699 | ['𝞜', 'N'], 1700 | ['𝞝', 'KS'], 1701 | ['𝞞', 'O'], 1702 | ['𝞟', 'P'], 1703 | ['𝞠', 'S'], 1704 | ['𝞡', 'TH'], 1705 | ['𝞢', 'S'], 1706 | ['𝞣', 'T'], 1707 | ['𝞤', 'Y'], 1708 | ['𝞥', 'F'], 1709 | ['𝞦', 'X'], 1710 | ['𝞧', 'PS'], 1711 | ['𝞨', 'O'], 1712 | ['𝞩', 'D'], 1713 | ['𝞪', 'av'], 1714 | ['𝞫', 'g'], 1715 | ['𝞬', 'd'], 1716 | ['𝞭', 'e'], 1717 | ['𝞮', 'z'], 1718 | ['𝞯', 'i'], 1719 | ['𝞰', 'i'], 1720 | ['𝞱', 'th'], 1721 | ['𝞲', 'i'], 1722 | ['𝞳', 'k'], 1723 | ['𝞴', 'l'], 1724 | ['𝞵', 'm'], 1725 | ['𝞶', 'n'], 1726 | ['𝞷', 'ks'], 1727 | ['𝞸', 'o'], 1728 | ['𝞹', 'p'], 1729 | ['𝞺', 'r'], 1730 | ['𝞻', 's'], 1731 | ['𝞼', 's'], 1732 | ['𝞽', 't'], 1733 | ['𝞾', 'y'], 1734 | ['𝞿', 'f'], 1735 | ['𝟀', 'x'], 1736 | ['𝟁', 'ps'], 1737 | ['𝟂', 'o'], 1738 | ['𝟃', 'a'], 1739 | ['𝟄', 'e'], 1740 | ['𝟅', 'i'], 1741 | ['𝟆', 'k'], 1742 | ['𝟇', 'f'], 1743 | ['𝟈', 'r'], 1744 | ['𝟉', 'p'], 1745 | ['𝟊', 'F'], 1746 | ['𝟋', 'f'], 1747 | ['⒜', '(a)'], 1748 | ['⒝', '(b)'], 1749 | ['⒞', '(c)'], 1750 | ['⒟', '(d)'], 1751 | ['⒠', '(e)'], 1752 | ['⒡', '(f)'], 1753 | ['⒢', '(g)'], 1754 | ['⒣', '(h)'], 1755 | ['⒤', '(i)'], 1756 | ['⒥', '(j)'], 1757 | ['⒦', '(k)'], 1758 | ['⒧', '(l)'], 1759 | ['⒨', '(m)'], 1760 | ['⒩', '(n)'], 1761 | ['⒪', '(o)'], 1762 | ['⒫', '(p)'], 1763 | ['⒬', '(q)'], 1764 | ['⒭', '(r)'], 1765 | ['⒮', '(s)'], 1766 | ['⒯', '(t)'], 1767 | ['⒰', '(u)'], 1768 | ['⒱', '(v)'], 1769 | ['⒲', '(w)'], 1770 | ['⒳', '(x)'], 1771 | ['⒴', '(y)'], 1772 | ['⒵', '(z)'], 1773 | ['Ⓐ', '(A)'], 1774 | ['Ⓑ', '(B)'], 1775 | ['Ⓒ', '(C)'], 1776 | ['Ⓓ', '(D)'], 1777 | ['Ⓔ', '(E)'], 1778 | ['Ⓕ', '(F)'], 1779 | ['Ⓖ', '(G)'], 1780 | ['Ⓗ', '(H)'], 1781 | ['Ⓘ', '(I)'], 1782 | ['Ⓙ', '(J)'], 1783 | ['Ⓚ', '(K)'], 1784 | ['Ⓛ', '(L)'], 1785 | ['Ⓝ', '(N)'], 1786 | ['Ⓞ', '(O)'], 1787 | ['Ⓟ', '(P)'], 1788 | ['Ⓠ', '(Q)'], 1789 | ['Ⓡ', '(R)'], 1790 | ['Ⓢ', '(S)'], 1791 | ['Ⓣ', '(T)'], 1792 | ['Ⓤ', '(U)'], 1793 | ['Ⓥ', '(V)'], 1794 | ['Ⓦ', '(W)'], 1795 | ['Ⓧ', '(X)'], 1796 | ['Ⓨ', '(Y)'], 1797 | ['Ⓩ', '(Z)'], 1798 | ['ⓐ', '(a)'], 1799 | ['ⓑ', '(b)'], 1800 | ['ⓒ', '(c)'], 1801 | ['ⓓ', '(d)'], 1802 | ['ⓔ', '(e)'], 1803 | ['ⓕ', '(f)'], 1804 | ['ⓖ', '(g)'], 1805 | ['ⓗ', '(h)'], 1806 | ['ⓘ', '(i)'], 1807 | ['ⓙ', '(j)'], 1808 | ['ⓚ', '(k)'], 1809 | ['ⓛ', '(l)'], 1810 | ['ⓜ', '(m)'], 1811 | ['ⓝ', '(n)'], 1812 | ['ⓞ', '(o)'], 1813 | ['ⓟ', '(p)'], 1814 | ['ⓠ', '(q)'], 1815 | ['ⓡ', '(r)'], 1816 | ['ⓢ', '(s)'], 1817 | ['ⓣ', '(t)'], 1818 | ['ⓤ', '(u)'], 1819 | ['ⓥ', '(v)'], 1820 | ['ⓦ', '(w)'], 1821 | ['ⓧ', '(x)'], 1822 | ['ⓨ', '(y)'], 1823 | ['ⓩ', '(z)'], 1824 | 1825 | // Maltese 1826 | ['Ċ', 'C'], 1827 | ['ċ', 'c'], 1828 | ['Ġ', 'G'], 1829 | ['ġ', 'g'], 1830 | ['Ħ', 'H'], 1831 | ['ħ', 'h'], 1832 | ['Ż', 'Z'], 1833 | ['ż', 'z'], 1834 | 1835 | // Numbers 1836 | ['𝟎', '0'], 1837 | ['𝟏', '1'], 1838 | ['𝟐', '2'], 1839 | ['𝟑', '3'], 1840 | ['𝟒', '4'], 1841 | ['𝟓', '5'], 1842 | ['𝟔', '6'], 1843 | ['𝟕', '7'], 1844 | ['𝟖', '8'], 1845 | ['𝟗', '9'], 1846 | ['𝟘', '0'], 1847 | ['𝟙', '1'], 1848 | ['𝟚', '2'], 1849 | ['𝟛', '3'], 1850 | ['𝟜', '4'], 1851 | ['𝟝', '5'], 1852 | ['𝟞', '6'], 1853 | ['𝟟', '7'], 1854 | ['𝟠', '8'], 1855 | ['𝟡', '9'], 1856 | ['𝟢', '0'], 1857 | ['𝟣', '1'], 1858 | ['𝟤', '2'], 1859 | ['𝟥', '3'], 1860 | ['𝟦', '4'], 1861 | ['𝟧', '5'], 1862 | ['𝟨', '6'], 1863 | ['𝟩', '7'], 1864 | ['𝟪', '8'], 1865 | ['𝟫', '9'], 1866 | ['𝟬', '0'], 1867 | ['𝟭', '1'], 1868 | ['𝟮', '2'], 1869 | ['𝟯', '3'], 1870 | ['𝟰', '4'], 1871 | ['𝟱', '5'], 1872 | ['𝟲', '6'], 1873 | ['𝟳', '7'], 1874 | ['𝟴', '8'], 1875 | ['𝟵', '9'], 1876 | ['𝟶', '0'], 1877 | ['𝟷', '1'], 1878 | ['𝟸', '2'], 1879 | ['𝟹', '3'], 1880 | ['𝟺', '4'], 1881 | ['𝟻', '5'], 1882 | ['𝟼', '6'], 1883 | ['𝟽', '7'], 1884 | ['𝟾', '8'], 1885 | ['𝟿', '9'], 1886 | ['①', '1'], 1887 | ['②', '2'], 1888 | ['③', '3'], 1889 | ['④', '4'], 1890 | ['⑤', '5'], 1891 | ['⑥', '6'], 1892 | ['⑦', '7'], 1893 | ['⑧', '8'], 1894 | ['⑨', '9'], 1895 | ['⑩', '10'], 1896 | ['⑪', '11'], 1897 | ['⑫', '12'], 1898 | ['⑬', '13'], 1899 | ['⑭', '14'], 1900 | ['⑮', '15'], 1901 | ['⑯', '16'], 1902 | ['⑰', '17'], 1903 | ['⑱', '18'], 1904 | ['⑲', '19'], 1905 | ['⑳', '20'], 1906 | ['⑴', '1'], 1907 | ['⑵', '2'], 1908 | ['⑶', '3'], 1909 | ['⑷', '4'], 1910 | ['⑸', '5'], 1911 | ['⑹', '6'], 1912 | ['⑺', '7'], 1913 | ['⑻', '8'], 1914 | ['⑼', '9'], 1915 | ['⑽', '10'], 1916 | ['⑾', '11'], 1917 | ['⑿', '12'], 1918 | ['⒀', '13'], 1919 | ['⒁', '14'], 1920 | ['⒂', '15'], 1921 | ['⒃', '16'], 1922 | ['⒄', '17'], 1923 | ['⒅', '18'], 1924 | ['⒆', '19'], 1925 | ['⒇', '20'], 1926 | ['⒈', '1.'], 1927 | ['⒉', '2.'], 1928 | ['⒊', '3.'], 1929 | ['⒋', '4.'], 1930 | ['⒌', '5.'], 1931 | ['⒍', '6.'], 1932 | ['⒎', '7.'], 1933 | ['⒏', '8.'], 1934 | ['⒐', '9.'], 1935 | ['⒑', '10.'], 1936 | ['⒒', '11.'], 1937 | ['⒓', '12.'], 1938 | ['⒔', '13.'], 1939 | ['⒕', '14.'], 1940 | ['⒖', '15.'], 1941 | ['⒗', '16.'], 1942 | ['⒘', '17.'], 1943 | ['⒙', '18.'], 1944 | ['⒚', '19.'], 1945 | ['⒛', '20.'], 1946 | ['⓪', '0'], 1947 | ['⓫', '11'], 1948 | ['⓬', '12'], 1949 | ['⓭', '13'], 1950 | ['⓮', '14'], 1951 | ['⓯', '15'], 1952 | ['⓰', '16'], 1953 | ['⓱', '17'], 1954 | ['⓲', '18'], 1955 | ['⓳', '19'], 1956 | ['⓴', '20'], 1957 | ['⓵', '1'], 1958 | ['⓶', '2'], 1959 | ['⓷', '3'], 1960 | ['⓸', '4'], 1961 | ['⓹', '5'], 1962 | ['⓺', '6'], 1963 | ['⓻', '7'], 1964 | ['⓼', '8'], 1965 | ['⓽', '9'], 1966 | ['⓾', '10'], 1967 | ['⓿', '0'], 1968 | 1969 | // Punctuation 1970 | ['🙰', '&'], 1971 | ['🙱', '&'], 1972 | ['🙲', '&'], 1973 | ['🙳', '&'], 1974 | ['🙴', '&'], 1975 | ['🙵', '&'], 1976 | ['🙶', '"'], 1977 | ['🙷', '"'], 1978 | ['🙸', '"'], 1979 | ['‽', '?!'], 1980 | ['🙹', '?!'], 1981 | ['🙺', '?!'], 1982 | ['🙻', '?!'], 1983 | ['🙼', '/'], 1984 | ['🙽', '\\'], 1985 | 1986 | // Alchemy 1987 | ['🜇', 'AR'], 1988 | ['🜈', 'V'], 1989 | ['🜉', 'V'], 1990 | ['🜆', 'VR'], 1991 | ['🜅', 'VF'], 1992 | ['🜩', '2'], 1993 | ['🜪', '5'], 1994 | ['🝡', 'f'], 1995 | ['🝢', 'W'], 1996 | ['🝣', 'U'], 1997 | ['🝧', 'V'], 1998 | ['🝨', 'T'], 1999 | ['🝪', 'V'], 2000 | ['🝫', 'MB'], 2001 | ['🝬', 'VB'], 2002 | ['🝲', '3B'], 2003 | ['🝳', '3B'], 2004 | 2005 | // Emojis 2006 | ['💯', '100'], 2007 | ['🔙', 'BACK'], 2008 | ['🔚', 'END'], 2009 | ['🔛', 'ON!'], 2010 | ['🔜', 'SOON'], 2011 | ['🔝', 'TOP'], 2012 | ['🔞', '18'], 2013 | ['🔤', 'abc'], 2014 | ['🔠', 'ABCD'], 2015 | ['🔡', 'abcd'], 2016 | ['🔢', '1234'], 2017 | ['🔣', 'T&@%'], 2018 | ['#️⃣', '#'], 2019 | ['*️⃣', '*'], 2020 | ['0️⃣', '0'], 2021 | ['1️⃣', '1'], 2022 | ['2️⃣', '2'], 2023 | ['3️⃣', '3'], 2024 | ['4️⃣', '4'], 2025 | ['5️⃣', '5'], 2026 | ['6️⃣', '6'], 2027 | ['7️⃣', '7'], 2028 | ['8️⃣', '8'], 2029 | ['9️⃣', '9'], 2030 | ['🔟', '10'], 2031 | ['🅰️', 'A'], 2032 | ['🅱️', 'B'], 2033 | ['🆎', 'AB'], 2034 | ['🆑', 'CL'], 2035 | ['🅾️', 'O'], 2036 | ['🅿', 'P'], 2037 | ['🆘', 'SOS'], 2038 | ['🅲', 'C'], 2039 | ['🅳', 'D'], 2040 | ['🅴', 'E'], 2041 | ['🅵', 'F'], 2042 | ['🅶', 'G'], 2043 | ['🅷', 'H'], 2044 | ['🅸', 'I'], 2045 | ['🅹', 'J'], 2046 | ['🅺', 'K'], 2047 | ['🅻', 'L'], 2048 | ['🅼', 'M'], 2049 | ['🅽', 'N'], 2050 | ['🆀', 'Q'], 2051 | ['🆁', 'R'], 2052 | ['🆂', 'S'], 2053 | ['🆃', 'T'], 2054 | ['🆄', 'U'], 2055 | ['🆅', 'V'], 2056 | ['🆆', 'W'], 2057 | ['🆇', 'X'], 2058 | ['🆈', 'Y'], 2059 | ['🆉', 'Z'], 2060 | 2061 | // Dashes not covered by Dash_Punctuation category 2062 | ['−', '-'], // U+2212 Minus Sign (Mathematical Operators category) 2063 | ['⁓', '-'], // U+2053 Swung Dash (Other_Punctuation category) 2064 | ]; 2065 | 2066 | const builtinReplacements = new Map(replacements); 2067 | 2068 | export default builtinReplacements; 2069 | --------------------------------------------------------------------------------