Ответ 1
В принципе, вам не повезло: http://www.siao2.com/2007/01/03/1392379.aspx
Если я хочу сделать следующую работу над Windows, каков правильный язык и как я обнаруживаю, что он действительно присутствует: Этот код работает универсально, или это просто моя система?
В принципе, вам не повезло: http://www.siao2.com/2007/01/03/1392379.aspx
Несмотря на то, что для названных локалей нет хорошей поддержки, Visual Studio 2010 включает в себя факсимильные преобразования UTF-8, необходимые для С++ 11: std::codecvt_utf8
для UCS2 и std::codecvt_utf8_utf16
для 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();
}
это выводит на мой 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 . . .
Per MSDN, он будет называться "english_us.65001". Но кодовая страница 65001 несколько уязвима для Windows.