Most of the programmers like, have started coding with non-UNICODE character set. In schools, university it really doesn’t matter. What we focus on is the implementation or solution for a particular problem and thus we learn how to program. But things are a bit different when we comes to serious software development. There are few reasons to develop with UNICODE.
1. The new generation operating systems are distributed all over the world with different local language support like Chinese, Japanese, etc. and natively supports UNICODE. All the operating system interfaces are designed with UNICODE.
2. It allows to easily localize our application. Single binary can contain support for multiple languages.
3. In the performance point of view UNICODE is better than using ANSI interface. Because it’s required ANSI/MBCS to UNICODE conversion before calling system API. The conversion cost and temporary buffers will be an overhead. Also it ensures that we can use all Operating system interfaces. Some APIs only supports UNICODE interfaces only.
4. COM and .NET Framework requires UNICODE strings. So using UNICODE ensures smooth interoperability/integration with these frameworks.
Is there anything additional? Please post as comments.

Yes great question.
Well, after using UNICODE for a while, there are quite a lot of drawback as well.
- A lot of the data we manipulate are still perfectly stored on 8 bit. Either because it’s the standard (URL, web pages) or because it uses UTF8 instead of UTF16 and you don’t want to decode it.
- UTF16 is equal to wchar_t and BSTR on Windows but on linux wchar_t is UTF32. There is no standard there.
- The idea that one character is one string element is not true for UTF16 as well. Several old or uncommon languages still require UTF32. So you will still have to carry the complexity of multichar encoding with UTF16.
- Nothing assure that future MS compilers will keep the equation BSTR = wchar_t = UNICODE.
- Eventually we started recoding to UTF8. Yes the conversion will take place at some places if the string is just passed around it will stay UTF16. May be it just take to abandon the idea are simple objects based on arrays.
- Suddenly when you start manipulating queries with resultsets of 500 megs memory is again an issue. in UTF16 it becomes 1 gig.
That’s truly inputs. Of course the usage of UNICODE strings must be standardized.