如果我想在Windows上进行以下工作,那么正确的语言环境是什么,以及如何检测它是否实际存在: 此代码是否工作在全局,还是仅仅是我的系统?
基本上,你运气不好: http : //www.siao2.com/2007/01/03/1392379.aspx
虽然对命名语言环境没有很好的支持,但Visual Studio 2010确实包含了C ++ 11所需的UTF-8转换方面:对于UCS2,使用std::codecvt_utf8_utf16
对于UTF-16使用std::codecvt_utf8_utf16
:
#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 . . .
根据MSDN ,它将被命名为“english_us.65001”。 但是代码页65001在Windows上有点片面。