5 ms·
Depends what you mean by "better". UTF-8 generally ends up using fewer bytes to represent the same string than UTF-16, unless you're using certain characters a
by Scorponok 13y ago
Depends what you mean by "better". UTF-8 generally ends up using fewer bytes to represent the same string than UTF-16, unless you're using certain characters a lot (e.g. for asian languages), so it's a candidate, but it's not like you could just flip a switch and make all javascript use UTF-8.
- oofabz 13y agoI think the size issue is a red herring. UTF-8 wins some, UTF-16 wins others, but either encoding is acceptable. There is no clear winner here so we should look at other properties. UTF-8 is more reliable, because mishandling variable-length characters is more obvious. In UTF-16 it's easy to write something that works with the BMP and call it good enough. Even worse, you may not even know it fails above the BMP, because those characters are so rare you might never test with them. But in UTF-8, if you screw up multi-byte characters, any non-ASCII character will trigger the bug, and you will fix your code more quickly. Also, UTF-8 does not suffer from endianness issues like UTF-16 does. Few people use the BOM and no one likes it. And most importantly, UTF-8 is compatible with ASCII.
- millstone 13y agoUTF-8 has its own unique issues, like non-shortest forms and invalid code units, that you are even less likely to encounter in the wild. Bugs in handling of these have enabled security exploits in the past.
- wrhs 13y agoBack in the real world though, UTF-16 almost never "wins" size comparisons in practice. For example, one would think that UTF-16 would be "better" than UTF-8 for pure Thai documents (2 bytes vs 3 bytes per Thai character) but in reality such a comparison is irrelevant, since the Thai government have decided that both are unacceptable in most cases and instead mandate the use of TIS-620 (1 byte per ASCII or Thai character). It's a similar story in almost every other case where UTF-16 may seem like the best choice for size purposes. There's usually a specialist or national standard encoding in place, with much more traction (and often required by law), that is smaller and doesn't share any of the heinous issues suffered by UTF-16. tl;dr: I don't think you made the point strongly enough. UTF-16 is an absolute joke and will only stay around due to Microsoft's stubbornness and lack of foresight. If you voluntarily use UTF-16 in 2014, you are a moron.
- lucian1900 13y agoThere is absolutely no situation in which UTF-16 wins over UTF-8, because of the surrogate pairs required. That makes both encodings variable length. UTF-32 is probably what you're thinking of.
- oofabz 13y agoI know that both encodings are variable-length. That is the issue I am trying to address. My point is that in UTF-16 it's too easy to ignore surrogate pairs. Lots of UTF-16 software fails to handle variable-length characters because they are so rare. But in UTF-8 you can't ignore multi-byte characters without obvious bugs. These bugs are noticed and fixed more quickly than UTF-16 surrogate pair bugs. This makes UTF-8 more reliable. I am not sure why you think I am advocating UTF-16. I said almost nothing good about it.
- millstone 13y agoBugs in UTF-8 handling of multibyte sequences need not be obvious. Google "CAPEC-80." UTF-16 has an advantage in that there's fewer failure modes, and fewer ways for a string to be invalid. edit: As for surrogate pairs, this is an issue, but I think it's overstated. A naïve program may accidentally split a UTF-16 surrogate pair, but that same program is just as liable to accidentally split a decomposed character sequence in UTF-8. You have to deal with those issues regardless of encoding.
- lmm 13y ago> A naïve program may accidentally split a UTF-16 surrogate pair, but that same program is just as liable to accidentally split a decomposed character sequence in UTF-8. You have to deal with those issues regardless of encoding. The point is that using UTF-8 makes these issues more obvious. Most programmers these days think to test with non-ascii characters. Fewer think to test with astral characters.
- userbinator 13y agoUTF-8 is variable length in that it can be anywhere from 1 to 4 bytes, while UTF-16 can either be 2 or 4. That makes a UTF-16 decoder/encoder half as complex as a UTF-8 one.
- userbinator 13y ago> Even worse, you may not even know it fails above the BMP, because those characters are so rare you might never test with them. I don't think this is too relevant because anyone who claims to know UTF-16 should know about the surrogates. And if you are handling mostly Asian text (which is where UTF-16 is more likely to be chosen), then those high characters become a lot more common.