Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: update Unicode letter detection in capitalized-comments rule #18375

Merged
merged 2 commits into from
Apr 25, 2024

Conversation

fasttime
Copy link
Member

Prerequisites checklist

What is the purpose of this pull request? (put an "X" next to an item)

[ ] Documentation update
[ ] Bug fix (template)
[ ] New rule (template)
[X] Changes an existing rule (template)
[ ] Add autofix to a rule
[ ] Add a CLI option
[ ] Add something to the core
[ ] Other, please explain:

What rule do you want to change?

capitalized-comments

What change do you want to make (place an "X" next to just one item)?

[X] Generate more warnings
[ ] Generate fewer warnings
[ ] Implement autofix
[ ] Implement suggestions

How will the change be implemented (place an "X" next to just one item)?

[ ] A new option
[X] A new default behavior
[ ] Other

Please provide some example code that this change will affect:

/* eslint capitalized-comments: "error" */

// ꮳꮃꭹ
/* eslint capitalized-comments: ["error", "never"] */

// Გ
// 𑢮

What does the rule currently do for this code?

Reports no errors.

What will the rule do after it's changed?

It will report the line comments in both examples as errors. All line comments use wrong capitalization according to current versions of Unicode.

What changes did you make? (Give an overview)

This PR updates the capitalized-comments rule to recognize characters that are considered letters in current versions of Unicode. Currently, the rule only recognizes letters that were such in Unicode 7.0.0, and only if composed by a single code unit (up to code point U+FFFF).

  • Replaced an autogenerated regular expression that matches letters of every alphabet in Unicode 7.0.0 with Unicode character class escape \p{L} (see compatibility) to match all letters in the version of Unicode of supported by the running engine.
  • Updated the rule logic to recognize Unicode characters composed of two code units.

Compared to the current regex, the new one will match 698 more letters that have uppercase or lowercase variations. These are the characters that could report more problems with the capitalized-comments rule.

Analysis details

The following script can be placed in the eslint repo directory with the main branch checked out to find characters that are considered letters:

// check-letters.js
const letters = require('./lib/rules/utils/patterns/letters');

const added = [];
const removed = [];
let allAdded = 0;
let allRemoved = 0;

for (let codePoint = 0; codePoint <= 0xffff; ++codePoint) {
    const char = String.fromCodePoint(codePoint);
    const lettersMatch = letters.test(char);
    const newMatch = /\p{L}/u.test(char);
    if (lettersMatch !== newMatch) {
        if (newMatch) {
            allAdded++;
        }
        else {
            allRemoved++;
        }
        if (char === char.toLocaleLowerCase() && char === char.toLocaleUpperCase()) {
            continue;
        }
        if (newMatch) {
            added.push(codePoint);
        }
        else {
            removed.push(codePoint);
        }
    }
}

function formatCodePoint(codePoint) {
    return `"${String.fromCodePoint(codePoint)}" (U+${codePoint.toString(16).toUpperCase().padStart(4, '0')})`;
}

console.log(`${added.length} new letters (${allAdded} including caseless)`);
console.log(`${removed.length} removed letters (${allRemoved} including caseless)`);
console.log('The new letters with case variations are:');
for (const codePoint of added) {
    let line = formatCodePoint(codePoint);
    const char = String.fromCodePoint(codePoint);
    const lowerChar = char.toLocaleLowerCase();
    const upperChar = char.toLocaleUpperCase();
    if (char !== lowerChar) {
        line += ` - lowercase: ${formatCodePoint(lowerChar.codePointAt())}`;
    }
    if (char !== upperChar) {
        line += ` - uppercase: ${formatCodePoint(upperChar.codePointAt())}`;
    }
    console.log(line);
}

This is the output:

698 new letters (88142 including caseless)
0 removed letters (2 including caseless)
The new letters with case variations are:
"Ᏽ" (U+13F5) - lowercase: "ᏽ" (U+13FD)
"ᏸ" (U+13F8) - uppercase: "Ᏸ" (U+13F0)
"ᏹ" (U+13F9) - uppercase: "Ᏹ" (U+13F1)
"ᏺ" (U+13FA) - uppercase: "Ᏺ" (U+13F2)
"ᏻ" (U+13FB) - uppercase: "Ᏻ" (U+13F3)
"ᏼ" (U+13FC) - uppercase: "Ᏼ" (U+13F4)
"ᏽ" (U+13FD) - uppercase: "Ᏽ" (U+13F5)
"ᲀ" (U+1C80) - uppercase: "В" (U+0412)
"ᲁ" (U+1C81) - uppercase: "Д" (U+0414)
"ᲂ" (U+1C82) - uppercase: "О" (U+041E)
"ᲃ" (U+1C83) - uppercase: "С" (U+0421)
"ᲄ" (U+1C84) - uppercase: "Т" (U+0422)
"ᲅ" (U+1C85) - uppercase: "Т" (U+0422)
"ᲆ" (U+1C86) - uppercase: "Ъ" (U+042A)
"ᲇ" (U+1C87) - uppercase: "Ѣ" (U+0462)
"ᲈ" (U+1C88) - uppercase: "Ꙋ" (U+A64A)
"Ა" (U+1C90) - lowercase: "ა" (U+10D0)
"Ბ" (U+1C91) - lowercase: "ბ" (U+10D1)
"Გ" (U+1C92) - lowercase: "გ" (U+10D2)
"Დ" (U+1C93) - lowercase: "დ" (U+10D3)
"Ე" (U+1C94) - lowercase: "ე" (U+10D4)
"Ვ" (U+1C95) - lowercase: "ვ" (U+10D5)
"Ზ" (U+1C96) - lowercase: "ზ" (U+10D6)
"Თ" (U+1C97) - lowercase: "თ" (U+10D7)
"Ი" (U+1C98) - lowercase: "ი" (U+10D8)
"Კ" (U+1C99) - lowercase: "კ" (U+10D9)
"Ლ" (U+1C9A) - lowercase: "ლ" (U+10DA)
"Მ" (U+1C9B) - lowercase: "მ" (U+10DB)
"Ნ" (U+1C9C) - lowercase: "ნ" (U+10DC)
"Ო" (U+1C9D) - lowercase: "ო" (U+10DD)
"Პ" (U+1C9E) - lowercase: "პ" (U+10DE)
"Ჟ" (U+1C9F) - lowercase: "ჟ" (U+10DF)
"Რ" (U+1CA0) - lowercase: "რ" (U+10E0)
"Ს" (U+1CA1) - lowercase: "ს" (U+10E1)
"Ტ" (U+1CA2) - lowercase: "ტ" (U+10E2)
"Უ" (U+1CA3) - lowercase: "უ" (U+10E3)
"Ფ" (U+1CA4) - lowercase: "ფ" (U+10E4)
"Ქ" (U+1CA5) - lowercase: "ქ" (U+10E5)
"Ღ" (U+1CA6) - lowercase: "ღ" (U+10E6)
"Ყ" (U+1CA7) - lowercase: "ყ" (U+10E7)
"Შ" (U+1CA8) - lowercase: "შ" (U+10E8)
"Ჩ" (U+1CA9) - lowercase: "ჩ" (U+10E9)
"Ც" (U+1CAA) - lowercase: "ც" (U+10EA)
"Ძ" (U+1CAB) - lowercase: "ძ" (U+10EB)
"Წ" (U+1CAC) - lowercase: "წ" (U+10EC)
"Ჭ" (U+1CAD) - lowercase: "ჭ" (U+10ED)
"Ხ" (U+1CAE) - lowercase: "ხ" (U+10EE)
"Ჯ" (U+1CAF) - lowercase: "ჯ" (U+10EF)
"Ჰ" (U+1CB0) - lowercase: "ჰ" (U+10F0)
"Ჱ" (U+1CB1) - lowercase: "ჱ" (U+10F1)
"Ჲ" (U+1CB2) - lowercase: "ჲ" (U+10F2)
"Ჳ" (U+1CB3) - lowercase: "ჳ" (U+10F3)
"Ჴ" (U+1CB4) - lowercase: "ჴ" (U+10F4)
"Ჵ" (U+1CB5) - lowercase: "ჵ" (U+10F5)
"Ჶ" (U+1CB6) - lowercase: "ჶ" (U+10F6)
"Ჷ" (U+1CB7) - lowercase: "ჷ" (U+10F7)
"Ჸ" (U+1CB8) - lowercase: "ჸ" (U+10F8)
"Ჹ" (U+1CB9) - lowercase: "ჹ" (U+10F9)
"Ჺ" (U+1CBA) - lowercase: "ჺ" (U+10FA)
"Ჽ" (U+1CBD) - lowercase: "ჽ" (U+10FD)
"Ჾ" (U+1CBE) - lowercase: "ჾ" (U+10FE)
"Ჿ" (U+1CBF) - lowercase: "ჿ" (U+10FF)
"Ⱟ" (U+2C2F) - lowercase: "ⱟ" (U+2C5F)
"ⱟ" (U+2C5F) - uppercase: "Ⱟ" (U+2C2F)
"Ɪ" (U+A7AE) - lowercase: "ɪ" (U+026A)
"Ʝ" (U+A7B2) - lowercase: "ʝ" (U+029D)
"Ꭓ" (U+A7B3) - lowercase: "ꭓ" (U+AB53)
"Ꞵ" (U+A7B4) - lowercase: "ꞵ" (U+A7B5)
"ꞵ" (U+A7B5) - uppercase: "Ꞵ" (U+A7B4)
"Ꞷ" (U+A7B6) - lowercase: "ꞷ" (U+A7B7)
"ꞷ" (U+A7B7) - uppercase: "Ꞷ" (U+A7B6)
"Ꞹ" (U+A7B8) - lowercase: "ꞹ" (U+A7B9)
"ꞹ" (U+A7B9) - uppercase: "Ꞹ" (U+A7B8)
"Ꞻ" (U+A7BA) - lowercase: "ꞻ" (U+A7BB)
"ꞻ" (U+A7BB) - uppercase: "Ꞻ" (U+A7BA)
"Ꞽ" (U+A7BC) - lowercase: "ꞽ" (U+A7BD)
"ꞽ" (U+A7BD) - uppercase: "Ꞽ" (U+A7BC)
"Ꞿ" (U+A7BE) - lowercase: "ꞿ" (U+A7BF)
"ꞿ" (U+A7BF) - uppercase: "Ꞿ" (U+A7BE)
"Ꟁ" (U+A7C0) - lowercase: "ꟁ" (U+A7C1)
"ꟁ" (U+A7C1) - uppercase: "Ꟁ" (U+A7C0)
"Ꟃ" (U+A7C2) - lowercase: "ꟃ" (U+A7C3)
"ꟃ" (U+A7C3) - uppercase: "Ꟃ" (U+A7C2)
"Ꞔ" (U+A7C4) - lowercase: "ꞔ" (U+A794)
"Ʂ" (U+A7C5) - lowercase: "ʂ" (U+0282)
"Ᶎ" (U+A7C6) - lowercase: "ᶎ" (U+1D8E)
"Ꟈ" (U+A7C7) - lowercase: "ꟈ" (U+A7C8)
"ꟈ" (U+A7C8) - uppercase: "Ꟈ" (U+A7C7)
"Ꟊ" (U+A7C9) - lowercase: "ꟊ" (U+A7CA)
"ꟊ" (U+A7CA) - uppercase: "Ꟊ" (U+A7C9)
"Ꟑ" (U+A7D0) - lowercase: "ꟑ" (U+A7D1)
"ꟑ" (U+A7D1) - uppercase: "Ꟑ" (U+A7D0)
"Ꟗ" (U+A7D6) - lowercase: "ꟗ" (U+A7D7)
"ꟗ" (U+A7D7) - uppercase: "Ꟗ" (U+A7D6)
"Ꟙ" (U+A7D8) - lowercase: "ꟙ" (U+A7D9)
"ꟙ" (U+A7D9) - uppercase: "Ꟙ" (U+A7D8)
"Ꟶ" (U+A7F5) - lowercase: "ꟶ" (U+A7F6)
"ꟶ" (U+A7F6) - uppercase: "Ꟶ" (U+A7F5)
"ꭰ" (U+AB70) - uppercase: "Ꭰ" (U+13A0)
"ꭱ" (U+AB71) - uppercase: "Ꭱ" (U+13A1)
"ꭲ" (U+AB72) - uppercase: "Ꭲ" (U+13A2)
"ꭳ" (U+AB73) - uppercase: "Ꭳ" (U+13A3)
"ꭴ" (U+AB74) - uppercase: "Ꭴ" (U+13A4)
"ꭵ" (U+AB75) - uppercase: "Ꭵ" (U+13A5)
"ꭶ" (U+AB76) - uppercase: "Ꭶ" (U+13A6)
"ꭷ" (U+AB77) - uppercase: "Ꭷ" (U+13A7)
"ꭸ" (U+AB78) - uppercase: "Ꭸ" (U+13A8)
"ꭹ" (U+AB79) - uppercase: "Ꭹ" (U+13A9)
"ꭺ" (U+AB7A) - uppercase: "Ꭺ" (U+13AA)
"ꭻ" (U+AB7B) - uppercase: "Ꭻ" (U+13AB)
"ꭼ" (U+AB7C) - uppercase: "Ꭼ" (U+13AC)
"ꭽ" (U+AB7D) - uppercase: "Ꭽ" (U+13AD)
"ꭾ" (U+AB7E) - uppercase: "Ꭾ" (U+13AE)
"ꭿ" (U+AB7F) - uppercase: "Ꭿ" (U+13AF)
"ꮀ" (U+AB80) - uppercase: "Ꮀ" (U+13B0)
"ꮁ" (U+AB81) - uppercase: "Ꮁ" (U+13B1)
"ꮂ" (U+AB82) - uppercase: "Ꮂ" (U+13B2)
"ꮃ" (U+AB83) - uppercase: "Ꮃ" (U+13B3)
"ꮄ" (U+AB84) - uppercase: "Ꮄ" (U+13B4)
"ꮅ" (U+AB85) - uppercase: "Ꮅ" (U+13B5)
"ꮆ" (U+AB86) - uppercase: "Ꮆ" (U+13B6)
"ꮇ" (U+AB87) - uppercase: "Ꮇ" (U+13B7)
"ꮈ" (U+AB88) - uppercase: "Ꮈ" (U+13B8)
"ꮉ" (U+AB89) - uppercase: "Ꮉ" (U+13B9)
"ꮊ" (U+AB8A) - uppercase: "Ꮊ" (U+13BA)
"ꮋ" (U+AB8B) - uppercase: "Ꮋ" (U+13BB)
"ꮌ" (U+AB8C) - uppercase: "Ꮌ" (U+13BC)
"ꮍ" (U+AB8D) - uppercase: "Ꮍ" (U+13BD)
"ꮎ" (U+AB8E) - uppercase: "Ꮎ" (U+13BE)
"ꮏ" (U+AB8F) - uppercase: "Ꮏ" (U+13BF)
"ꮐ" (U+AB90) - uppercase: "Ꮐ" (U+13C0)
"ꮑ" (U+AB91) - uppercase: "Ꮑ" (U+13C1)
"ꮒ" (U+AB92) - uppercase: "Ꮒ" (U+13C2)
"ꮓ" (U+AB93) - uppercase: "Ꮓ" (U+13C3)
"ꮔ" (U+AB94) - uppercase: "Ꮔ" (U+13C4)
"ꮕ" (U+AB95) - uppercase: "Ꮕ" (U+13C5)
"ꮖ" (U+AB96) - uppercase: "Ꮖ" (U+13C6)
"ꮗ" (U+AB97) - uppercase: "Ꮗ" (U+13C7)
"ꮘ" (U+AB98) - uppercase: "Ꮘ" (U+13C8)
"ꮙ" (U+AB99) - uppercase: "Ꮙ" (U+13C9)
"ꮚ" (U+AB9A) - uppercase: "Ꮚ" (U+13CA)
"ꮛ" (U+AB9B) - uppercase: "Ꮛ" (U+13CB)
"ꮜ" (U+AB9C) - uppercase: "Ꮜ" (U+13CC)
"ꮝ" (U+AB9D) - uppercase: "Ꮝ" (U+13CD)
"ꮞ" (U+AB9E) - uppercase: "Ꮞ" (U+13CE)
"ꮟ" (U+AB9F) - uppercase: "Ꮟ" (U+13CF)
"ꮠ" (U+ABA0) - uppercase: "Ꮠ" (U+13D0)
"ꮡ" (U+ABA1) - uppercase: "Ꮡ" (U+13D1)
"ꮢ" (U+ABA2) - uppercase: "Ꮢ" (U+13D2)
"ꮣ" (U+ABA3) - uppercase: "Ꮣ" (U+13D3)
"ꮤ" (U+ABA4) - uppercase: "Ꮤ" (U+13D4)
"ꮥ" (U+ABA5) - uppercase: "Ꮥ" (U+13D5)
"ꮦ" (U+ABA6) - uppercase: "Ꮦ" (U+13D6)
"ꮧ" (U+ABA7) - uppercase: "Ꮧ" (U+13D7)
"ꮨ" (U+ABA8) - uppercase: "Ꮨ" (U+13D8)
"ꮩ" (U+ABA9) - uppercase: "Ꮩ" (U+13D9)
"ꮪ" (U+ABAA) - uppercase: "Ꮪ" (U+13DA)
"ꮫ" (U+ABAB) - uppercase: "Ꮫ" (U+13DB)
"ꮬ" (U+ABAC) - uppercase: "Ꮬ" (U+13DC)
"ꮭ" (U+ABAD) - uppercase: "Ꮭ" (U+13DD)
"ꮮ" (U+ABAE) - uppercase: "Ꮮ" (U+13DE)
"ꮯ" (U+ABAF) - uppercase: "Ꮯ" (U+13DF)
"ꮰ" (U+ABB0) - uppercase: "Ꮰ" (U+13E0)
"ꮱ" (U+ABB1) - uppercase: "Ꮱ" (U+13E1)
"ꮲ" (U+ABB2) - uppercase: "Ꮲ" (U+13E2)
"ꮳ" (U+ABB3) - uppercase: "Ꮳ" (U+13E3)
"ꮴ" (U+ABB4) - uppercase: "Ꮴ" (U+13E4)
"ꮵ" (U+ABB5) - uppercase: "Ꮵ" (U+13E5)
"ꮶ" (U+ABB6) - uppercase: "Ꮶ" (U+13E6)
"ꮷ" (U+ABB7) - uppercase: "Ꮷ" (U+13E7)
"ꮸ" (U+ABB8) - uppercase: "Ꮸ" (U+13E8)
"ꮹ" (U+ABB9) - uppercase: "Ꮹ" (U+13E9)
"ꮺ" (U+ABBA) - uppercase: "Ꮺ" (U+13EA)
"ꮻ" (U+ABBB) - uppercase: "Ꮻ" (U+13EB)
"ꮼ" (U+ABBC) - uppercase: "Ꮼ" (U+13EC)
"ꮽ" (U+ABBD) - uppercase: "Ꮽ" (U+13ED)
"ꮾ" (U+ABBE) - uppercase: "Ꮾ" (U+13EE)
"ꮿ" (U+ABBF) - uppercase: "Ꮿ" (U+13EF)
"𐐀" (U+10400) - lowercase: "𐐨" (U+10428)
"𐐁" (U+10401) - lowercase: "𐐩" (U+10429)
"𐐂" (U+10402) - lowercase: "𐐪" (U+1042A)
"𐐃" (U+10403) - lowercase: "𐐫" (U+1042B)
"𐐄" (U+10404) - lowercase: "𐐬" (U+1042C)
"𐐅" (U+10405) - lowercase: "𐐭" (U+1042D)
"𐐆" (U+10406) - lowercase: "𐐮" (U+1042E)
"𐐇" (U+10407) - lowercase: "𐐯" (U+1042F)
"𐐈" (U+10408) - lowercase: "𐐰" (U+10430)
"𐐉" (U+10409) - lowercase: "𐐱" (U+10431)
"𐐊" (U+1040A) - lowercase: "𐐲" (U+10432)
"𐐋" (U+1040B) - lowercase: "𐐳" (U+10433)
"𐐌" (U+1040C) - lowercase: "𐐴" (U+10434)
"𐐍" (U+1040D) - lowercase: "𐐵" (U+10435)
"𐐎" (U+1040E) - lowercase: "𐐶" (U+10436)
"𐐏" (U+1040F) - lowercase: "𐐷" (U+10437)
"𐐐" (U+10410) - lowercase: "𐐸" (U+10438)
"𐐑" (U+10411) - lowercase: "𐐹" (U+10439)
"𐐒" (U+10412) - lowercase: "𐐺" (U+1043A)
"𐐓" (U+10413) - lowercase: "𐐻" (U+1043B)
"𐐔" (U+10414) - lowercase: "𐐼" (U+1043C)
"𐐕" (U+10415) - lowercase: "𐐽" (U+1043D)
"𐐖" (U+10416) - lowercase: "𐐾" (U+1043E)
"𐐗" (U+10417) - lowercase: "𐐿" (U+1043F)
"𐐘" (U+10418) - lowercase: "𐑀" (U+10440)
"𐐙" (U+10419) - lowercase: "𐑁" (U+10441)
"𐐚" (U+1041A) - lowercase: "𐑂" (U+10442)
"𐐛" (U+1041B) - lowercase: "𐑃" (U+10443)
"𐐜" (U+1041C) - lowercase: "𐑄" (U+10444)
"𐐝" (U+1041D) - lowercase: "𐑅" (U+10445)
"𐐞" (U+1041E) - lowercase: "𐑆" (U+10446)
"𐐟" (U+1041F) - lowercase: "𐑇" (U+10447)
"𐐠" (U+10420) - lowercase: "𐑈" (U+10448)
"𐐡" (U+10421) - lowercase: "𐑉" (U+10449)
"𐐢" (U+10422) - lowercase: "𐑊" (U+1044A)
"𐐣" (U+10423) - lowercase: "𐑋" (U+1044B)
"𐐤" (U+10424) - lowercase: "𐑌" (U+1044C)
"𐐥" (U+10425) - lowercase: "𐑍" (U+1044D)
"𐐦" (U+10426) - lowercase: "𐑎" (U+1044E)
"𐐧" (U+10427) - lowercase: "𐑏" (U+1044F)
"𐐨" (U+10428) - uppercase: "𐐀" (U+10400)
"𐐩" (U+10429) - uppercase: "𐐁" (U+10401)
"𐐪" (U+1042A) - uppercase: "𐐂" (U+10402)
"𐐫" (U+1042B) - uppercase: "𐐃" (U+10403)
"𐐬" (U+1042C) - uppercase: "𐐄" (U+10404)
"𐐭" (U+1042D) - uppercase: "𐐅" (U+10405)
"𐐮" (U+1042E) - uppercase: "𐐆" (U+10406)
"𐐯" (U+1042F) - uppercase: "𐐇" (U+10407)
"𐐰" (U+10430) - uppercase: "𐐈" (U+10408)
"𐐱" (U+10431) - uppercase: "𐐉" (U+10409)
"𐐲" (U+10432) - uppercase: "𐐊" (U+1040A)
"𐐳" (U+10433) - uppercase: "𐐋" (U+1040B)
"𐐴" (U+10434) - uppercase: "𐐌" (U+1040C)
"𐐵" (U+10435) - uppercase: "𐐍" (U+1040D)
"𐐶" (U+10436) - uppercase: "𐐎" (U+1040E)
"𐐷" (U+10437) - uppercase: "𐐏" (U+1040F)
"𐐸" (U+10438) - uppercase: "𐐐" (U+10410)
"𐐹" (U+10439) - uppercase: "𐐑" (U+10411)
"𐐺" (U+1043A) - uppercase: "𐐒" (U+10412)
"𐐻" (U+1043B) - uppercase: "𐐓" (U+10413)
"𐐼" (U+1043C) - uppercase: "𐐔" (U+10414)
"𐐽" (U+1043D) - uppercase: "𐐕" (U+10415)
"𐐾" (U+1043E) - uppercase: "𐐖" (U+10416)
"𐐿" (U+1043F) - uppercase: "𐐗" (U+10417)
"𐑀" (U+10440) - uppercase: "𐐘" (U+10418)
"𐑁" (U+10441) - uppercase: "𐐙" (U+10419)
"𐑂" (U+10442) - uppercase: "𐐚" (U+1041A)
"𐑃" (U+10443) - uppercase: "𐐛" (U+1041B)
"𐑄" (U+10444) - uppercase: "𐐜" (U+1041C)
"𐑅" (U+10445) - uppercase: "𐐝" (U+1041D)
"𐑆" (U+10446) - uppercase: "𐐞" (U+1041E)
"𐑇" (U+10447) - uppercase: "𐐟" (U+1041F)
"𐑈" (U+10448) - uppercase: "𐐠" (U+10420)
"𐑉" (U+10449) - uppercase: "𐐡" (U+10421)
"𐑊" (U+1044A) - uppercase: "𐐢" (U+10422)
"𐑋" (U+1044B) - uppercase: "𐐣" (U+10423)
"𐑌" (U+1044C) - uppercase: "𐐤" (U+10424)
"𐑍" (U+1044D) - uppercase: "𐐥" (U+10425)
"𐑎" (U+1044E) - uppercase: "𐐦" (U+10426)
"𐑏" (U+1044F) - uppercase: "𐐧" (U+10427)
"𐒰" (U+104B0) - lowercase: "𐓘" (U+104D8)
"𐒱" (U+104B1) - lowercase: "𐓙" (U+104D9)
"𐒲" (U+104B2) - lowercase: "𐓚" (U+104DA)
"𐒳" (U+104B3) - lowercase: "𐓛" (U+104DB)
"𐒴" (U+104B4) - lowercase: "𐓜" (U+104DC)
"𐒵" (U+104B5) - lowercase: "𐓝" (U+104DD)
"𐒶" (U+104B6) - lowercase: "𐓞" (U+104DE)
"𐒷" (U+104B7) - lowercase: "𐓟" (U+104DF)
"𐒸" (U+104B8) - lowercase: "𐓠" (U+104E0)
"𐒹" (U+104B9) - lowercase: "𐓡" (U+104E1)
"𐒺" (U+104BA) - lowercase: "𐓢" (U+104E2)
"𐒻" (U+104BB) - lowercase: "𐓣" (U+104E3)
"𐒼" (U+104BC) - lowercase: "𐓤" (U+104E4)
"𐒽" (U+104BD) - lowercase: "𐓥" (U+104E5)
"𐒾" (U+104BE) - lowercase: "𐓦" (U+104E6)
"𐒿" (U+104BF) - lowercase: "𐓧" (U+104E7)
"𐓀" (U+104C0) - lowercase: "𐓨" (U+104E8)
"𐓁" (U+104C1) - lowercase: "𐓩" (U+104E9)
"𐓂" (U+104C2) - lowercase: "𐓪" (U+104EA)
"𐓃" (U+104C3) - lowercase: "𐓫" (U+104EB)
"𐓄" (U+104C4) - lowercase: "𐓬" (U+104EC)
"𐓅" (U+104C5) - lowercase: "𐓭" (U+104ED)
"𐓆" (U+104C6) - lowercase: "𐓮" (U+104EE)
"𐓇" (U+104C7) - lowercase: "𐓯" (U+104EF)
"𐓈" (U+104C8) - lowercase: "𐓰" (U+104F0)
"𐓉" (U+104C9) - lowercase: "𐓱" (U+104F1)
"𐓊" (U+104CA) - lowercase: "𐓲" (U+104F2)
"𐓋" (U+104CB) - lowercase: "𐓳" (U+104F3)
"𐓌" (U+104CC) - lowercase: "𐓴" (U+104F4)
"𐓍" (U+104CD) - lowercase: "𐓵" (U+104F5)
"𐓎" (U+104CE) - lowercase: "𐓶" (U+104F6)
"𐓏" (U+104CF) - lowercase: "𐓷" (U+104F7)
"𐓐" (U+104D0) - lowercase: "𐓸" (U+104F8)
"𐓑" (U+104D1) - lowercase: "𐓹" (U+104F9)
"𐓒" (U+104D2) - lowercase: "𐓺" (U+104FA)
"𐓓" (U+104D3) - lowercase: "𐓻" (U+104FB)
"𐓘" (U+104D8) - uppercase: "𐒰" (U+104B0)
"𐓙" (U+104D9) - uppercase: "𐒱" (U+104B1)
"𐓚" (U+104DA) - uppercase: "𐒲" (U+104B2)
"𐓛" (U+104DB) - uppercase: "𐒳" (U+104B3)
"𐓜" (U+104DC) - uppercase: "𐒴" (U+104B4)
"𐓝" (U+104DD) - uppercase: "𐒵" (U+104B5)
"𐓞" (U+104DE) - uppercase: "𐒶" (U+104B6)
"𐓟" (U+104DF) - uppercase: "𐒷" (U+104B7)
"𐓠" (U+104E0) - uppercase: "𐒸" (U+104B8)
"𐓡" (U+104E1) - uppercase: "𐒹" (U+104B9)
"𐓢" (U+104E2) - uppercase: "𐒺" (U+104BA)
"𐓣" (U+104E3) - uppercase: "𐒻" (U+104BB)
"𐓤" (U+104E4) - uppercase: "𐒼" (U+104BC)
"𐓥" (U+104E5) - uppercase: "𐒽" (U+104BD)
"𐓦" (U+104E6) - uppercase: "𐒾" (U+104BE)
"𐓧" (U+104E7) - uppercase: "𐒿" (U+104BF)
"𐓨" (U+104E8) - uppercase: "𐓀" (U+104C0)
"𐓩" (U+104E9) - uppercase: "𐓁" (U+104C1)
"𐓪" (U+104EA) - uppercase: "𐓂" (U+104C2)
"𐓫" (U+104EB) - uppercase: "𐓃" (U+104C3)
"𐓬" (U+104EC) - uppercase: "𐓄" (U+104C4)
"𐓭" (U+104ED) - uppercase: "𐓅" (U+104C5)
"𐓮" (U+104EE) - uppercase: "𐓆" (U+104C6)
"𐓯" (U+104EF) - uppercase: "𐓇" (U+104C7)
"𐓰" (U+104F0) - uppercase: "𐓈" (U+104C8)
"𐓱" (U+104F1) - uppercase: "𐓉" (U+104C9)
"𐓲" (U+104F2) - uppercase: "𐓊" (U+104CA)
"𐓳" (U+104F3) - uppercase: "𐓋" (U+104CB)
"𐓴" (U+104F4) - uppercase: "𐓌" (U+104CC)
"𐓵" (U+104F5) - uppercase: "𐓍" (U+104CD)
"𐓶" (U+104F6) - uppercase: "𐓎" (U+104CE)
"𐓷" (U+104F7) - uppercase: "𐓏" (U+104CF)
"𐓸" (U+104F8) - uppercase: "𐓐" (U+104D0)
"𐓹" (U+104F9) - uppercase: "𐓑" (U+104D1)
"𐓺" (U+104FA) - uppercase: "𐓒" (U+104D2)
"𐓻" (U+104FB) - uppercase: "𐓓" (U+104D3)
"𐕰" (U+10570) - lowercase: "𐖗" (U+10597)
"𐕱" (U+10571) - lowercase: "𐖘" (U+10598)
"𐕲" (U+10572) - lowercase: "𐖙" (U+10599)
"𐕳" (U+10573) - lowercase: "𐖚" (U+1059A)
"𐕴" (U+10574) - lowercase: "𐖛" (U+1059B)
"𐕵" (U+10575) - lowercase: "𐖜" (U+1059C)
"𐕶" (U+10576) - lowercase: "𐖝" (U+1059D)
"𐕷" (U+10577) - lowercase: "𐖞" (U+1059E)
"𐕸" (U+10578) - lowercase: "𐖟" (U+1059F)
"𐕹" (U+10579) - lowercase: "𐖠" (U+105A0)
"𐕺" (U+1057A) - lowercase: "𐖡" (U+105A1)
"𐕼" (U+1057C) - lowercase: "𐖣" (U+105A3)
"𐕽" (U+1057D) - lowercase: "𐖤" (U+105A4)
"𐕾" (U+1057E) - lowercase: "𐖥" (U+105A5)
"𐕿" (U+1057F) - lowercase: "𐖦" (U+105A6)
"𐖀" (U+10580) - lowercase: "𐖧" (U+105A7)
"𐖁" (U+10581) - lowercase: "𐖨" (U+105A8)
"𐖂" (U+10582) - lowercase: "𐖩" (U+105A9)
"𐖃" (U+10583) - lowercase: "𐖪" (U+105AA)
"𐖄" (U+10584) - lowercase: "𐖫" (U+105AB)
"𐖅" (U+10585) - lowercase: "𐖬" (U+105AC)
"𐖆" (U+10586) - lowercase: "𐖭" (U+105AD)
"𐖇" (U+10587) - lowercase: "𐖮" (U+105AE)
"𐖈" (U+10588) - lowercase: "𐖯" (U+105AF)
"𐖉" (U+10589) - lowercase: "𐖰" (U+105B0)
"𐖊" (U+1058A) - lowercase: "𐖱" (U+105B1)
"𐖌" (U+1058C) - lowercase: "𐖳" (U+105B3)
"𐖍" (U+1058D) - lowercase: "𐖴" (U+105B4)
"𐖎" (U+1058E) - lowercase: "𐖵" (U+105B5)
"𐖏" (U+1058F) - lowercase: "𐖶" (U+105B6)
"𐖐" (U+10590) - lowercase: "𐖷" (U+105B7)
"𐖑" (U+10591) - lowercase: "𐖸" (U+105B8)
"𐖒" (U+10592) - lowercase: "𐖹" (U+105B9)
"𐖔" (U+10594) - lowercase: "𐖻" (U+105BB)
"𐖕" (U+10595) - lowercase: "𐖼" (U+105BC)
"𐖗" (U+10597) - uppercase: "𐕰" (U+10570)
"𐖘" (U+10598) - uppercase: "𐕱" (U+10571)
"𐖙" (U+10599) - uppercase: "𐕲" (U+10572)
"𐖚" (U+1059A) - uppercase: "𐕳" (U+10573)
"𐖛" (U+1059B) - uppercase: "𐕴" (U+10574)
"𐖜" (U+1059C) - uppercase: "𐕵" (U+10575)
"𐖝" (U+1059D) - uppercase: "𐕶" (U+10576)
"𐖞" (U+1059E) - uppercase: "𐕷" (U+10577)
"𐖟" (U+1059F) - uppercase: "𐕸" (U+10578)
"𐖠" (U+105A0) - uppercase: "𐕹" (U+10579)
"𐖡" (U+105A1) - uppercase: "𐕺" (U+1057A)
"𐖣" (U+105A3) - uppercase: "𐕼" (U+1057C)
"𐖤" (U+105A4) - uppercase: "𐕽" (U+1057D)
"𐖥" (U+105A5) - uppercase: "𐕾" (U+1057E)
"𐖦" (U+105A6) - uppercase: "𐕿" (U+1057F)
"𐖧" (U+105A7) - uppercase: "𐖀" (U+10580)
"𐖨" (U+105A8) - uppercase: "𐖁" (U+10581)
"𐖩" (U+105A9) - uppercase: "𐖂" (U+10582)
"𐖪" (U+105AA) - uppercase: "𐖃" (U+10583)
"𐖫" (U+105AB) - uppercase: "𐖄" (U+10584)
"𐖬" (U+105AC) - uppercase: "𐖅" (U+10585)
"𐖭" (U+105AD) - uppercase: "𐖆" (U+10586)
"𐖮" (U+105AE) - uppercase: "𐖇" (U+10587)
"𐖯" (U+105AF) - uppercase: "𐖈" (U+10588)
"𐖰" (U+105B0) - uppercase: "𐖉" (U+10589)
"𐖱" (U+105B1) - uppercase: "𐖊" (U+1058A)
"𐖳" (U+105B3) - uppercase: "𐖌" (U+1058C)
"𐖴" (U+105B4) - uppercase: "𐖍" (U+1058D)
"𐖵" (U+105B5) - uppercase: "𐖎" (U+1058E)
"𐖶" (U+105B6) - uppercase: "𐖏" (U+1058F)
"𐖷" (U+105B7) - uppercase: "𐖐" (U+10590)
"𐖸" (U+105B8) - uppercase: "𐖑" (U+10591)
"𐖹" (U+105B9) - uppercase: "𐖒" (U+10592)
"𐖻" (U+105BB) - uppercase: "𐖔" (U+10594)
"𐖼" (U+105BC) - uppercase: "𐖕" (U+10595)
"𐲀" (U+10C80) - lowercase: "𐳀" (U+10CC0)
"𐲁" (U+10C81) - lowercase: "𐳁" (U+10CC1)
"𐲂" (U+10C82) - lowercase: "𐳂" (U+10CC2)
"𐲃" (U+10C83) - lowercase: "𐳃" (U+10CC3)
"𐲄" (U+10C84) - lowercase: "𐳄" (U+10CC4)
"𐲅" (U+10C85) - lowercase: "𐳅" (U+10CC5)
"𐲆" (U+10C86) - lowercase: "𐳆" (U+10CC6)
"𐲇" (U+10C87) - lowercase: "𐳇" (U+10CC7)
"𐲈" (U+10C88) - lowercase: "𐳈" (U+10CC8)
"𐲉" (U+10C89) - lowercase: "𐳉" (U+10CC9)
"𐲊" (U+10C8A) - lowercase: "𐳊" (U+10CCA)
"𐲋" (U+10C8B) - lowercase: "𐳋" (U+10CCB)
"𐲌" (U+10C8C) - lowercase: "𐳌" (U+10CCC)
"𐲍" (U+10C8D) - lowercase: "𐳍" (U+10CCD)
"𐲎" (U+10C8E) - lowercase: "𐳎" (U+10CCE)
"𐲏" (U+10C8F) - lowercase: "𐳏" (U+10CCF)
"𐲐" (U+10C90) - lowercase: "𐳐" (U+10CD0)
"𐲑" (U+10C91) - lowercase: "𐳑" (U+10CD1)
"𐲒" (U+10C92) - lowercase: "𐳒" (U+10CD2)
"𐲓" (U+10C93) - lowercase: "𐳓" (U+10CD3)
"𐲔" (U+10C94) - lowercase: "𐳔" (U+10CD4)
"𐲕" (U+10C95) - lowercase: "𐳕" (U+10CD5)
"𐲖" (U+10C96) - lowercase: "𐳖" (U+10CD6)
"𐲗" (U+10C97) - lowercase: "𐳗" (U+10CD7)
"𐲘" (U+10C98) - lowercase: "𐳘" (U+10CD8)
"𐲙" (U+10C99) - lowercase: "𐳙" (U+10CD9)
"𐲚" (U+10C9A) - lowercase: "𐳚" (U+10CDA)
"𐲛" (U+10C9B) - lowercase: "𐳛" (U+10CDB)
"𐲜" (U+10C9C) - lowercase: "𐳜" (U+10CDC)
"𐲝" (U+10C9D) - lowercase: "𐳝" (U+10CDD)
"𐲞" (U+10C9E) - lowercase: "𐳞" (U+10CDE)
"𐲟" (U+10C9F) - lowercase: "𐳟" (U+10CDF)
"𐲠" (U+10CA0) - lowercase: "𐳠" (U+10CE0)
"𐲡" (U+10CA1) - lowercase: "𐳡" (U+10CE1)
"𐲢" (U+10CA2) - lowercase: "𐳢" (U+10CE2)
"𐲣" (U+10CA3) - lowercase: "𐳣" (U+10CE3)
"𐲤" (U+10CA4) - lowercase: "𐳤" (U+10CE4)
"𐲥" (U+10CA5) - lowercase: "𐳥" (U+10CE5)
"𐲦" (U+10CA6) - lowercase: "𐳦" (U+10CE6)
"𐲧" (U+10CA7) - lowercase: "𐳧" (U+10CE7)
"𐲨" (U+10CA8) - lowercase: "𐳨" (U+10CE8)
"𐲩" (U+10CA9) - lowercase: "𐳩" (U+10CE9)
"𐲪" (U+10CAA) - lowercase: "𐳪" (U+10CEA)
"𐲫" (U+10CAB) - lowercase: "𐳫" (U+10CEB)
"𐲬" (U+10CAC) - lowercase: "𐳬" (U+10CEC)
"𐲭" (U+10CAD) - lowercase: "𐳭" (U+10CED)
"𐲮" (U+10CAE) - lowercase: "𐳮" (U+10CEE)
"𐲯" (U+10CAF) - lowercase: "𐳯" (U+10CEF)
"𐲰" (U+10CB0) - lowercase: "𐳰" (U+10CF0)
"𐲱" (U+10CB1) - lowercase: "𐳱" (U+10CF1)
"𐲲" (U+10CB2) - lowercase: "𐳲" (U+10CF2)
"𐳀" (U+10CC0) - uppercase: "𐲀" (U+10C80)
"𐳁" (U+10CC1) - uppercase: "𐲁" (U+10C81)
"𐳂" (U+10CC2) - uppercase: "𐲂" (U+10C82)
"𐳃" (U+10CC3) - uppercase: "𐲃" (U+10C83)
"𐳄" (U+10CC4) - uppercase: "𐲄" (U+10C84)
"𐳅" (U+10CC5) - uppercase: "𐲅" (U+10C85)
"𐳆" (U+10CC6) - uppercase: "𐲆" (U+10C86)
"𐳇" (U+10CC7) - uppercase: "𐲇" (U+10C87)
"𐳈" (U+10CC8) - uppercase: "𐲈" (U+10C88)
"𐳉" (U+10CC9) - uppercase: "𐲉" (U+10C89)
"𐳊" (U+10CCA) - uppercase: "𐲊" (U+10C8A)
"𐳋" (U+10CCB) - uppercase: "𐲋" (U+10C8B)
"𐳌" (U+10CCC) - uppercase: "𐲌" (U+10C8C)
"𐳍" (U+10CCD) - uppercase: "𐲍" (U+10C8D)
"𐳎" (U+10CCE) - uppercase: "𐲎" (U+10C8E)
"𐳏" (U+10CCF) - uppercase: "𐲏" (U+10C8F)
"𐳐" (U+10CD0) - uppercase: "𐲐" (U+10C90)
"𐳑" (U+10CD1) - uppercase: "𐲑" (U+10C91)
"𐳒" (U+10CD2) - uppercase: "𐲒" (U+10C92)
"𐳓" (U+10CD3) - uppercase: "𐲓" (U+10C93)
"𐳔" (U+10CD4) - uppercase: "𐲔" (U+10C94)
"𐳕" (U+10CD5) - uppercase: "𐲕" (U+10C95)
"𐳖" (U+10CD6) - uppercase: "𐲖" (U+10C96)
"𐳗" (U+10CD7) - uppercase: "𐲗" (U+10C97)
"𐳘" (U+10CD8) - uppercase: "𐲘" (U+10C98)
"𐳙" (U+10CD9) - uppercase: "𐲙" (U+10C99)
"𐳚" (U+10CDA) - uppercase: "𐲚" (U+10C9A)
"𐳛" (U+10CDB) - uppercase: "𐲛" (U+10C9B)
"𐳜" (U+10CDC) - uppercase: "𐲜" (U+10C9C)
"𐳝" (U+10CDD) - uppercase: "𐲝" (U+10C9D)
"𐳞" (U+10CDE) - uppercase: "𐲞" (U+10C9E)
"𐳟" (U+10CDF) - uppercase: "𐲟" (U+10C9F)
"𐳠" (U+10CE0) - uppercase: "𐲠" (U+10CA0)
"𐳡" (U+10CE1) - uppercase: "𐲡" (U+10CA1)
"𐳢" (U+10CE2) - uppercase: "𐲢" (U+10CA2)
"𐳣" (U+10CE3) - uppercase: "𐲣" (U+10CA3)
"𐳤" (U+10CE4) - uppercase: "𐲤" (U+10CA4)
"𐳥" (U+10CE5) - uppercase: "𐲥" (U+10CA5)
"𐳦" (U+10CE6) - uppercase: "𐲦" (U+10CA6)
"𐳧" (U+10CE7) - uppercase: "𐲧" (U+10CA7)
"𐳨" (U+10CE8) - uppercase: "𐲨" (U+10CA8)
"𐳩" (U+10CE9) - uppercase: "𐲩" (U+10CA9)
"𐳪" (U+10CEA) - uppercase: "𐲪" (U+10CAA)
"𐳫" (U+10CEB) - uppercase: "𐲫" (U+10CAB)
"𐳬" (U+10CEC) - uppercase: "𐲬" (U+10CAC)
"𐳭" (U+10CED) - uppercase: "𐲭" (U+10CAD)
"𐳮" (U+10CEE) - uppercase: "𐲮" (U+10CAE)
"𐳯" (U+10CEF) - uppercase: "𐲯" (U+10CAF)
"𐳰" (U+10CF0) - uppercase: "𐲰" (U+10CB0)
"𐳱" (U+10CF1) - uppercase: "𐲱" (U+10CB1)
"𐳲" (U+10CF2) - uppercase: "𐲲" (U+10CB2)
"𑢠" (U+118A0) - lowercase: "𑣀" (U+118C0)
"𑢡" (U+118A1) - lowercase: "𑣁" (U+118C1)
"𑢢" (U+118A2) - lowercase: "𑣂" (U+118C2)
"𑢣" (U+118A3) - lowercase: "𑣃" (U+118C3)
"𑢤" (U+118A4) - lowercase: "𑣄" (U+118C4)
"𑢥" (U+118A5) - lowercase: "𑣅" (U+118C5)
"𑢦" (U+118A6) - lowercase: "𑣆" (U+118C6)
"𑢧" (U+118A7) - lowercase: "𑣇" (U+118C7)
"𑢨" (U+118A8) - lowercase: "𑣈" (U+118C8)
"𑢩" (U+118A9) - lowercase: "𑣉" (U+118C9)
"𑢪" (U+118AA) - lowercase: "𑣊" (U+118CA)
"𑢫" (U+118AB) - lowercase: "𑣋" (U+118CB)
"𑢬" (U+118AC) - lowercase: "𑣌" (U+118CC)
"𑢭" (U+118AD) - lowercase: "𑣍" (U+118CD)
"𑢮" (U+118AE) - lowercase: "𑣎" (U+118CE)
"𑢯" (U+118AF) - lowercase: "𑣏" (U+118CF)
"𑢰" (U+118B0) - lowercase: "𑣐" (U+118D0)
"𑢱" (U+118B1) - lowercase: "𑣑" (U+118D1)
"𑢲" (U+118B2) - lowercase: "𑣒" (U+118D2)
"𑢳" (U+118B3) - lowercase: "𑣓" (U+118D3)
"𑢴" (U+118B4) - lowercase: "𑣔" (U+118D4)
"𑢵" (U+118B5) - lowercase: "𑣕" (U+118D5)
"𑢶" (U+118B6) - lowercase: "𑣖" (U+118D6)
"𑢷" (U+118B7) - lowercase: "𑣗" (U+118D7)
"𑢸" (U+118B8) - lowercase: "𑣘" (U+118D8)
"𑢹" (U+118B9) - lowercase: "𑣙" (U+118D9)
"𑢺" (U+118BA) - lowercase: "𑣚" (U+118DA)
"𑢻" (U+118BB) - lowercase: "𑣛" (U+118DB)
"𑢼" (U+118BC) - lowercase: "𑣜" (U+118DC)
"𑢽" (U+118BD) - lowercase: "𑣝" (U+118DD)
"𑢾" (U+118BE) - lowercase: "𑣞" (U+118DE)
"𑢿" (U+118BF) - lowercase: "𑣟" (U+118DF)
"𑣀" (U+118C0) - uppercase: "𑢠" (U+118A0)
"𑣁" (U+118C1) - uppercase: "𑢡" (U+118A1)
"𑣂" (U+118C2) - uppercase: "𑢢" (U+118A2)
"𑣃" (U+118C3) - uppercase: "𑢣" (U+118A3)
"𑣄" (U+118C4) - uppercase: "𑢤" (U+118A4)
"𑣅" (U+118C5) - uppercase: "𑢥" (U+118A5)
"𑣆" (U+118C6) - uppercase: "𑢦" (U+118A6)
"𑣇" (U+118C7) - uppercase: "𑢧" (U+118A7)
"𑣈" (U+118C8) - uppercase: "𑢨" (U+118A8)
"𑣉" (U+118C9) - uppercase: "𑢩" (U+118A9)
"𑣊" (U+118CA) - uppercase: "𑢪" (U+118AA)
"𑣋" (U+118CB) - uppercase: "𑢫" (U+118AB)
"𑣌" (U+118CC) - uppercase: "𑢬" (U+118AC)
"𑣍" (U+118CD) - uppercase: "𑢭" (U+118AD)
"𑣎" (U+118CE) - uppercase: "𑢮" (U+118AE)
"𑣏" (U+118CF) - uppercase: "𑢯" (U+118AF)
"𑣐" (U+118D0) - uppercase: "𑢰" (U+118B0)
"𑣑" (U+118D1) - uppercase: "𑢱" (U+118B1)
"𑣒" (U+118D2) - uppercase: "𑢲" (U+118B2)
"𑣓" (U+118D3) - uppercase: "𑢳" (U+118B3)
"𑣔" (U+118D4) - uppercase: "𑢴" (U+118B4)
"𑣕" (U+118D5) - uppercase: "𑢵" (U+118B5)
"𑣖" (U+118D6) - uppercase: "𑢶" (U+118B6)
"𑣗" (U+118D7) - uppercase: "𑢷" (U+118B7)
"𑣘" (U+118D8) - uppercase: "𑢸" (U+118B8)
"𑣙" (U+118D9) - uppercase: "𑢹" (U+118B9)
"𑣚" (U+118DA) - uppercase: "𑢺" (U+118BA)
"𑣛" (U+118DB) - uppercase: "𑢻" (U+118BB)
"𑣜" (U+118DC) - uppercase: "𑢼" (U+118BC)
"𑣝" (U+118DD) - uppercase: "𑢽" (U+118BD)
"𑣞" (U+118DE) - uppercase: "𑢾" (U+118BE)
"𑣟" (U+118DF) - uppercase: "𑢿" (U+118BF)
"𖹀" (U+16E40) - lowercase: "𖹠" (U+16E60)
"𖹁" (U+16E41) - lowercase: "𖹡" (U+16E61)
"𖹂" (U+16E42) - lowercase: "𖹢" (U+16E62)
"𖹃" (U+16E43) - lowercase: "𖹣" (U+16E63)
"𖹄" (U+16E44) - lowercase: "𖹤" (U+16E64)
"𖹅" (U+16E45) - lowercase: "𖹥" (U+16E65)
"𖹆" (U+16E46) - lowercase: "𖹦" (U+16E66)
"𖹇" (U+16E47) - lowercase: "𖹧" (U+16E67)
"𖹈" (U+16E48) - lowercase: "𖹨" (U+16E68)
"𖹉" (U+16E49) - lowercase: "𖹩" (U+16E69)
"𖹊" (U+16E4A) - lowercase: "𖹪" (U+16E6A)
"𖹋" (U+16E4B) - lowercase: "𖹫" (U+16E6B)
"𖹌" (U+16E4C) - lowercase: "𖹬" (U+16E6C)
"𖹍" (U+16E4D) - lowercase: "𖹭" (U+16E6D)
"𖹎" (U+16E4E) - lowercase: "𖹮" (U+16E6E)
"𖹏" (U+16E4F) - lowercase: "𖹯" (U+16E6F)
"𖹐" (U+16E50) - lowercase: "𖹰" (U+16E70)
"𖹑" (U+16E51) - lowercase: "𖹱" (U+16E71)
"𖹒" (U+16E52) - lowercase: "𖹲" (U+16E72)
"𖹓" (U+16E53) - lowercase: "𖹳" (U+16E73)
"𖹔" (U+16E54) - lowercase: "𖹴" (U+16E74)
"𖹕" (U+16E55) - lowercase: "𖹵" (U+16E75)
"𖹖" (U+16E56) - lowercase: "𖹶" (U+16E76)
"𖹗" (U+16E57) - lowercase: "𖹷" (U+16E77)
"𖹘" (U+16E58) - lowercase: "𖹸" (U+16E78)
"𖹙" (U+16E59) - lowercase: "𖹹" (U+16E79)
"𖹚" (U+16E5A) - lowercase: "𖹺" (U+16E7A)
"𖹛" (U+16E5B) - lowercase: "𖹻" (U+16E7B)
"𖹜" (U+16E5C) - lowercase: "𖹼" (U+16E7C)
"𖹝" (U+16E5D) - lowercase: "𖹽" (U+16E7D)
"𖹞" (U+16E5E) - lowercase: "𖹾" (U+16E7E)
"𖹟" (U+16E5F) - lowercase: "𖹿" (U+16E7F)
"𖹠" (U+16E60) - uppercase: "𖹀" (U+16E40)
"𖹡" (U+16E61) - uppercase: "𖹁" (U+16E41)
"𖹢" (U+16E62) - uppercase: "𖹂" (U+16E42)
"𖹣" (U+16E63) - uppercase: "𖹃" (U+16E43)
"𖹤" (U+16E64) - uppercase: "𖹄" (U+16E44)
"𖹥" (U+16E65) - uppercase: "𖹅" (U+16E45)
"𖹦" (U+16E66) - uppercase: "𖹆" (U+16E46)
"𖹧" (U+16E67) - uppercase: "𖹇" (U+16E47)
"𖹨" (U+16E68) - uppercase: "𖹈" (U+16E48)
"𖹩" (U+16E69) - uppercase: "𖹉" (U+16E49)
"𖹪" (U+16E6A) - uppercase: "𖹊" (U+16E4A)
"𖹫" (U+16E6B) - uppercase: "𖹋" (U+16E4B)
"𖹬" (U+16E6C) - uppercase: "𖹌" (U+16E4C)
"𖹭" (U+16E6D) - uppercase: "𖹍" (U+16E4D)
"𖹮" (U+16E6E) - uppercase: "𖹎" (U+16E4E)
"𖹯" (U+16E6F) - uppercase: "𖹏" (U+16E4F)
"𖹰" (U+16E70) - uppercase: "𖹐" (U+16E50)
"𖹱" (U+16E71) - uppercase: "𖹑" (U+16E51)
"𖹲" (U+16E72) - uppercase: "𖹒" (U+16E52)
"𖹳" (U+16E73) - uppercase: "𖹓" (U+16E53)
"𖹴" (U+16E74) - uppercase: "𖹔" (U+16E54)
"𖹵" (U+16E75) - uppercase: "𖹕" (U+16E55)
"𖹶" (U+16E76) - uppercase: "𖹖" (U+16E56)
"𖹷" (U+16E77) - uppercase: "𖹗" (U+16E57)
"𖹸" (U+16E78) - uppercase: "𖹘" (U+16E58)
"𖹹" (U+16E79) - uppercase: "𖹙" (U+16E59)
"𖹺" (U+16E7A) - uppercase: "𖹚" (U+16E5A)
"𖹻" (U+16E7B) - uppercase: "𖹛" (U+16E5B)
"𖹼" (U+16E7C) - uppercase: "𖹜" (U+16E5C)
"𖹽" (U+16E7D) - uppercase: "𖹝" (U+16E5D)
"𖹾" (U+16E7E) - uppercase: "𖹞" (U+16E5E)
"𖹿" (U+16E7F) - uppercase: "𖹟" (U+16E5F)
"𞤀" (U+1E900) - lowercase: "𞤢" (U+1E922)
"𞤁" (U+1E901) - lowercase: "𞤣" (U+1E923)
"𞤂" (U+1E902) - lowercase: "𞤤" (U+1E924)
"𞤃" (U+1E903) - lowercase: "𞤥" (U+1E925)
"𞤄" (U+1E904) - lowercase: "𞤦" (U+1E926)
"𞤅" (U+1E905) - lowercase: "𞤧" (U+1E927)
"𞤆" (U+1E906) - lowercase: "𞤨" (U+1E928)
"𞤇" (U+1E907) - lowercase: "𞤩" (U+1E929)
"𞤈" (U+1E908) - lowercase: "𞤪" (U+1E92A)
"𞤉" (U+1E909) - lowercase: "𞤫" (U+1E92B)
"𞤊" (U+1E90A) - lowercase: "𞤬" (U+1E92C)
"𞤋" (U+1E90B) - lowercase: "𞤭" (U+1E92D)
"𞤌" (U+1E90C) - lowercase: "𞤮" (U+1E92E)
"𞤍" (U+1E90D) - lowercase: "𞤯" (U+1E92F)
"𞤎" (U+1E90E) - lowercase: "𞤰" (U+1E930)
"𞤏" (U+1E90F) - lowercase: "𞤱" (U+1E931)
"𞤐" (U+1E910) - lowercase: "𞤲" (U+1E932)
"𞤑" (U+1E911) - lowercase: "𞤳" (U+1E933)
"𞤒" (U+1E912) - lowercase: "𞤴" (U+1E934)
"𞤓" (U+1E913) - lowercase: "𞤵" (U+1E935)
"𞤔" (U+1E914) - lowercase: "𞤶" (U+1E936)
"𞤕" (U+1E915) - lowercase: "𞤷" (U+1E937)
"𞤖" (U+1E916) - lowercase: "𞤸" (U+1E938)
"𞤗" (U+1E917) - lowercase: "𞤹" (U+1E939)
"𞤘" (U+1E918) - lowercase: "𞤺" (U+1E93A)
"𞤙" (U+1E919) - lowercase: "𞤻" (U+1E93B)
"𞤚" (U+1E91A) - lowercase: "𞤼" (U+1E93C)
"𞤛" (U+1E91B) - lowercase: "𞤽" (U+1E93D)
"𞤜" (U+1E91C) - lowercase: "𞤾" (U+1E93E)
"𞤝" (U+1E91D) - lowercase: "𞤿" (U+1E93F)
"𞤞" (U+1E91E) - lowercase: "𞥀" (U+1E940)
"𞤟" (U+1E91F) - lowercase: "𞥁" (U+1E941)
"𞤠" (U+1E920) - lowercase: "𞥂" (U+1E942)
"𞤡" (U+1E921) - lowercase: "𞥃" (U+1E943)
"𞤢" (U+1E922) - uppercase: "𞤀" (U+1E900)
"𞤣" (U+1E923) - uppercase: "𞤁" (U+1E901)
"𞤤" (U+1E924) - uppercase: "𞤂" (U+1E902)
"𞤥" (U+1E925) - uppercase: "𞤃" (U+1E903)
"𞤦" (U+1E926) - uppercase: "𞤄" (U+1E904)
"𞤧" (U+1E927) - uppercase: "𞤅" (U+1E905)
"𞤨" (U+1E928) - uppercase: "𞤆" (U+1E906)
"𞤩" (U+1E929) - uppercase: "𞤇" (U+1E907)
"𞤪" (U+1E92A) - uppercase: "𞤈" (U+1E908)
"𞤫" (U+1E92B) - uppercase: "𞤉" (U+1E909)
"𞤬" (U+1E92C) - uppercase: "𞤊" (U+1E90A)
"𞤭" (U+1E92D) - uppercase: "𞤋" (U+1E90B)
"𞤮" (U+1E92E) - uppercase: "𞤌" (U+1E90C)
"𞤯" (U+1E92F) - uppercase: "𞤍" (U+1E90D)
"𞤰" (U+1E930) - uppercase: "𞤎" (U+1E90E)
"𞤱" (U+1E931) - uppercase: "𞤏" (U+1E90F)
"𞤲" (U+1E932) - uppercase: "𞤐" (U+1E910)
"𞤳" (U+1E933) - uppercase: "𞤑" (U+1E911)
"𞤴" (U+1E934) - uppercase: "𞤒" (U+1E912)
"𞤵" (U+1E935) - uppercase: "𞤓" (U+1E913)
"𞤶" (U+1E936) - uppercase: "𞤔" (U+1E914)
"𞤷" (U+1E937) - uppercase: "𞤕" (U+1E915)
"𞤸" (U+1E938) - uppercase: "𞤖" (U+1E916)
"𞤹" (U+1E939) - uppercase: "𞤗" (U+1E917)
"𞤺" (U+1E93A) - uppercase: "𞤘" (U+1E918)
"𞤻" (U+1E93B) - uppercase: "𞤙" (U+1E919)
"𞤼" (U+1E93C) - uppercase: "𞤚" (U+1E91A)
"𞤽" (U+1E93D) - uppercase: "𞤛" (U+1E91B)
"𞤾" (U+1E93E) - uppercase: "𞤜" (U+1E91C)
"𞤿" (U+1E93F) - uppercase: "𞤝" (U+1E91D)
"𞥀" (U+1E940) - uppercase: "𞤞" (U+1E91E)
"𞥁" (U+1E941) - uppercase: "𞤟" (U+1E91F)
"𞥂" (U+1E942) - uppercase: "𞤠" (U+1E920)
"𞥃" (U+1E943) - uppercase: "𞤡" (U+1E921)

Is there anything you'd like reviewers to focus on?

JavaScript engines are routinely updated to implement the latest version of Unicode. If the Unicode specification changes, there is a chance that the Unicode character class escape \p{L} may start to work differently in new version of Node.js. This means that the rule's behavior may change depending on the version of Node.js used by the user. The advantage is that the regex will never become outdated.

We have the same situation for other Unicode features in our code, like the \p{Mc} escape, or for Intl.Segmenter.

@eslint-github-bot eslint-github-bot bot added the feature This change adds a new feature to ESLint label Apr 22, 2024
@github-actions github-actions bot added the rule Relates to ESLint's core rules label Apr 22, 2024
Copy link

netlify bot commented Apr 22, 2024

Deploy Preview for docs-eslint canceled.

Name Link
🔨 Latest commit 2c6a4b6
🔍 Latest deploy log https://app.netlify.com/sites/docs-eslint/deploys/6625fc54eb040a0009623dee

@fasttime fasttime marked this pull request as ready for review April 22, 2024 06:05
@fasttime fasttime requested a review from a team as a code owner April 22, 2024 06:05
Copy link
Member

@aladdin-add aladdin-add left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Would like another review before merging.

@aladdin-add aladdin-add added the accepted There is consensus among the team that this change meets the criteria for inclusion label Apr 22, 2024
@nzakas
Copy link
Member

nzakas commented Apr 24, 2024

A couple of things:

  1. This is a stylistic rule, which we aren't updating any more.
  2. The point of this rule is to make comments more human-readable. Will this really catch problems that are useful to developers?

I think overall, I'm not sure of the utility of this change. I suppose it's technically a bug, but pragmatically, I'm not sure how this change benefits users.

That said, if people feel strongly that this should be fixed, we can merge this. Let's just please be careful about spending time on rules that are just enforcing stylistic preferences.

@fasttime
Copy link
Member Author

The main purpose was to remove lib/rules/utils/patterns/letters.js, which has the character of legacy internationalization code, and is now covered by built-in language functionality. The remaining changes are to ensure that the affected rule is still working as intended after the Unicode upgrade.

This is in fact a change request in form of a PR, so it's fine to close it if there is no consensus that it should be merged.

Copy link
Member

@mdjermanovic mdjermanovic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks!

I'm fine with this change because it replaces a manual and now outdated check with a built-in language feature.

@mdjermanovic
Copy link
Member

As we have 3 people in favor, and @nzakas is not opposed to merging this, I'm going to merge it now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
accepted There is consensus among the team that this change meets the criteria for inclusion feature This change adds a new feature to ESLint rule Relates to ESLint's core rules
Projects
Status: Complete
Development

Successfully merging this pull request may close these issues.

None yet

4 participants