果然是历史原因,哈哈!
看C#:
http://blog.coverity.com/2014/04/09/why-utf-16stackoverflow的回答:
http://stackoverflow.com/questions/5292150/whats-the-point-of-utf-16C#是因为VB用的是BSTR(带长度前缀的UCS-2?),Java诞生的时候只有UCS-2可选。
为了兼容,采用了超集UTF16,而不是不兼容的UTF8。
值得注意的是,C#忽略了UTF16 4字节的问题,如果字符串含有编码为4字节的字符,获取长度等会有问题。C#的开发者在第一个链接里提到了。。。。
个人猜测C#这么做的原因可能是 如果考虑到4字节,对字符串操作必须先编解码,程序的效率影响会比较大。
看了一下Erlang的文档,最新的支持unicode。采用latin-1标志位确定是采用UTF-8还是字节编码。同时文档也提到了:
It can be speculated that the UTF-16 encoding standard was, from the beginning, expected to be able to hold all Unicode characters in one 16-bit entity, but then had to be extended, leaving a hole in the Unicode range to cope with backward compatibility.