“Allowed” depends on the context.
The onchain .eth Registrar Controllers that control issuance of direct subnames of .eth “allow” any characters. This includes underscores, “.”, invisible characters, etc… These smart contracts only validate a minimum length for direct subnames of .eth. Given ENS has decided to accept emojis and other special characters as valid there are reasons (technical, economic, etc…) why enforcing ENSIP-15 at the smart contract level doesn’t make sense.
ENS is more than “.eth” or direct subnames of “.eth”. Other name issuers exist other than the onchain .eth Registrar Controllers. These can all “allow” whatever policy they want for issuing names. For example, there are over 4 million cb.id names that are all ENS names. Or check out all the subnames of dcl.eth from Decentraland. Or check out https://www.my.box/
However, properly implemented ENS clients should all be following the ENSIP-15 ENS Normalize standard. A properly implemented ENS client does not “allow” names that fail to meet those standards.
Distilling this down:
- Name Issuance: Doesn’t require enforcement of ENSIP-15.
- Forward Name Resolution: A properly implemented client always enforces ENSIP-15.
- Reverse Name Resolution: A properly implemented client always enforces ENSIP-15. If the primary name doesn’t pass ENS Normalize it should be as if the account has no primary name defined at all.
This means there can be ENS names that technically exist but are unreachable by a properly implemented ENS client.
That’s unfortunate complexity, but if developers building on ENS are educated on these careful details it is all manageable.
There’s several gotchas here that could be good to put more attention on in ENS developer docs. For example: ENS Normalize should be performed on all names read from the blockchain (directly or indirectly). This includes smart contract events, the ENS Subgraph, ENS primary names, etc… Depending on the features being built on ENS, a dev can build their apps improperly if they only perform ENS Normalize on the text input fields in their app.