JavaScript skriv ut alla använda Unicode-tecken
Jag försöker få JavaScript att skriva ut alla Unicode-tecken. Enligt min forskning finns det 1 114 112 Unicode-tecken.
Ett skript som följande skulle kunna fungera:
for(i = 0; i < 1114112; i++)
console.log(String.fromCharCode(i));
Men jag upptäckte att endast 10 % av de 1 114 112 Unicode-tecknen används.
Hur kan jag bara skriva ut de använda Unicode-tecknen?
Svar #1
Som Jukka sa, har JavaScript inget inbyggt sätt att veta om en viss Unicode-kodpunkt redan har tilldelats en symbol eller inte.
Det finns fortfarande ett sätt att göra det du vill, dock.
Jag har skrivit flera skript som parsar Unicode-databasen och skapar separata datafiler för varje kategori, egenskap, skript, block osv. i Unicode. Jag har också skapat ett HTTP-API som låter dig programmässigt hämta alla kodpunkter (dvs. en matris av siffror) i en given Unicode-kategori, eller alla symboler (dvs. en matris med strängar för varje tecken) med en viss Unicode-egenskap, eller ett reguljärt uttryck som matchar alla symboler i ett visst Unicode-skript.
Till exempel, för att få en array av strängar som innehåller ett objekt för varje Unicode-kodpunkt som har tilldelats en symbol i Unicode v6.3.0, kan du använda följande URL:
http://mathias.html5.org/data/unicode/format?version=6.3.0&property=Assigned&type=symbols&prepend=window.symbols%20%3D%20&append=%3B
Observera att du kan lägga till vad du vill före och efter resultatet genom att justera URL-parametrarna, för att göra det enklare att återanvända datan i dina egna skript. En exempel-HTML-sida som console.log()ar alla dessa symboler, som du begärde, kan skrivas på följande sätt:
<!DOCTYPE html>
<meta charset="utf-8">
<title>All assigned Unicode v6.3.0 symbols</title>
<script src="http://mathias.html5.org/data/unicode/format?version=6.3.0&property=Assigned&type=symbols&prepend=window.symbols%20%3D%20&append=%3B"></script>
<script>
window.symbols.forEach(function(symbol) {
// Do what you want to do with `symbol` here, e.g.
console.log(symbol);
});
</script>
Demo. Observera att eftersom detta är mycket data, kan du förvänta dig att din DevTools-konsol blir långsam när du öppnar den här sidan.
Uppdatering: Numera bör du istället använda Unicode-datapaket som unicode-11.0.0. I Node.js kan du då göra följande:
const symbols = require('unicode-11.0.0/Binary_Property/Assigned/symbols.js');
console.log(symbols);
// Or, to get the code points:
require('unicode-11.0.0/Binary_Property/Assigned/code-points.js');
// Or, to get a regular expression that only matches these characters:
require('unicode-11.0.0/Binary_Property/Assigned/regex.js');
Svar #2
Det finns inget direkt sätt i JavaScript att ta reda på om en kodpunkt är tilldelad en karaktär eller inte, vilket verkar vara frågan här. Du behöver information som hämtats från lämpliga källor, och denna information behöver uppdateras varje gång nya tecken tilldelas i nya versioner av Unicode.
Det finns 1 114 112 kodpunkter i Unicode. Unicode-standarden tilldelar varje kodpunkt egenskapen gc, General Category. Om värdet på denna egenskap är något annat än Cs, Co eller Cn, tilldelas kodpunkten en tecken. (Kodpunkter med gc lika med Co är kodpunkter för privat användning, till vilka inget tecken är tilldelat, men de kan användas för tecken genom privata avtal.)
Det du skulle behöva göra är att skaffa en kopia av några relevanta filer i Unicode-teckendatabasen (egentligen bara en samling filer i specifika format) och skriva kod som läser den och genererar information om tilldelade kodpunkter. För syftet att skriva ut alla Unicode-tecken kan det vara bäst att generera informationen som en array av intervall av tilldelade kodpunkter. Och detta skulle behöva upprepas när standarden uppdateras med nya tecken.
Även resten är inte trivial. Du skulle behöva bestämma vad det betyder att skriva ut ett tecken. Vissa tecken är styrtecken som kan ha en effekt, såsom att orsaka en ny rad, men saknar en synlig bild. Vissa (mellanslag) har tomma bilder. Vissa (kombinerande tecken) är avsedda att renderas som tecken fästa vid föregående tecken, även om de också har konventionella renderingar som "fristående" tecken. Vissa är avsedda att ta i stort sett olika former beroende på närmaste kontext; de kan också ha isolerade former, men att bara skriva ett tecken efter ett annat garanterar inte på något sätt att en isolerad form används.
Sedan finns problemet med typsnitt. Inget enskilt typsnitt kan innehålla alla Unicode-tecken, så du skulle behöva hitta en samling typsnitt som tillsammans täcker hela Unicode, helst så att de på något sätt matchar stilmässigt.
Så om du bara letar efter en sammanställning av alla utskrivbara Unicode-tecken, överväg att använda Unicode-kodtabellerna.
