What is the Windows equivalent for en_US.UTF-8 locale?
If I want to make the following work on Windows, what is the correct locale and how do I detect that it is actually present: Does this code work universaly, or is it just my system?
Answers
Basically, you are out of luck: http://www.siao2.com/2007/01/03/1392379.aspx
Although there isn't good support for named locales, Visual Studio 2010 does include the UTF-8 conversion facets required by C++11: std::codecvt_utf8 for UCS2 and std::codecvt_utf8_utf16 for UTF-16:
#include <fstream> #include <iostream> #include <string> #include <locale> #include <codecvt> void prepare_file() { // UTF-8 data char utf8[] = {'\x7a', // latin small letter 'z' U+007a '\xe6','\xb0','\xb4', // CJK ideograph "water" U+6c34 '\xf0','\x9d','\x84','\x8b'}; // musical sign segno U+1d10b std::ofstream fout("text.txt"); fout.write(utf8, sizeof utf8); } void test_file_utf16() { std::wifstream fin("text.txt"); fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf8_utf16<wchar_t>)); std::cout << "Read from file using UTF-8/UTF-16 codecvt\n"; for(wchar_t c; fin >> c; ) std::cout << std::hex << std::showbase << c << '\n'; } void test_file_ucs2() { std::wifstream fin("text.txt"); fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf8<wchar_t>)); std::cout << "Read from file using UTF-8/UCS2 codecvt\n"; for(wchar_t c; fin >> c; ) std::cout << std::hex << std::showbase << c << '\n'; } int main() { prepare_file(); test_file_utf16(); test_file_ucs2(); }
this outputs, on my Visual Studio 2010 EE SP1
Read from file using UTF-8/UTF-16 codecvt 0x7a 0x6c34 0xd834 0xdd0b Read from file using UTF-8/UCS2 codecvt 0x7a 0x6c34 0xd10b Press any key to continue . . .