# The Sad State of HTML Email Input Fields and IDNs The current state of HTML email input fields is a bit of a mess when it comes to IDNs (Internationalised Domain Names). You would think it was as simple as: ```html ``` You would be wrong though. Firefox is fine with the above, but Chrome says the contents of the field are invalid. Chrome will let you type "person@ü.example.com" into an email input field, but if you set it using HTML or JavaScript, it will say it is invalid. For Chrome you have to encode it using [punycode](https://www.wikipedia.org/wiki/Punycode) first: ```html ``` That fixes things for Chrome, and Chrome still helpfully displays the unicode version "person@ü.example.com", but now Firefox displays it as "person@xn--tda.example.com". Which is not what I want. To add further complication, if a user types "person@ü.example.com" into one of these fields, and you run the following bit of JavaScript: ```javascript const value = document.querySelector('input[type="email"]').value; ``` Firefox returns the version that was typed in, but Chrome returns the punycode encoded version - "person@xn--tda.example.com" So who is right? Well, according to the [HTML spec](https://www.w3.org/TR/html-markup/datatypes.html#form.data.emailaddress) an email input field is valid if it matches: ```text /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/ ``` Which doesn't include non-ascii characters. So it would *seem* like Chrome is doing the right thing as far as the HTML spec says. Firefox on the other hand seems to be doing what the spec *should* say. God knows how IE/Edge behave; probably in some entirely different manner. So for now, to pre-fill a HTML email input field, or change one using JavaScript, a punycode library and feature detection is required: ```javascript const usePunycodeLibrary = (function(){ const i = document.createElement('input'); i.type = 'email'; i.value = "person@ü.example.com"; return !i.validity.valid; })(); ``` So I should just use an input field of type "text" right? Well, then I lose the extra features that modern browsers provide when they know that an input field should contain an email address. Simple things like client side validation and the "@" symbol being more prominent on software keyboards. Don't you just love web development?