/* This file is part of hugin. hugin is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. hugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with hugin. If not, see . */ /** * @file unicode.cpp * @brief Test program for locales and wide and narrow strings. * * Created on: Jul 14, 2010 * @author Florian Achleitner */ #include #include #include #include #include #include /** * Tester that cleared up several things about wide and narrow character streams * and locales. * */ int main(int argc, char* argv[]) { std::locale de("de_DE.utf8"); // the global locale is the default value for new streams and sets the C locale. std::cout << "C locale " << std::locale::global(std::locale("")).name() << std::endl; std::cout << "C locale " << std::locale::global(de).name() << std::endl; // This changes the C locale, but has no effect on the C++ streams. setlocale(LC_ALL, "en_US.utf8"); std::cout << "C++ locale " << std::cout.getloc().name() << std::endl; std::cout.imbue(de); std::cout << "C++ locale " << std::cout.getloc().name() << std::endl; float comma = 15.45; const char text[] = "olé" ; const std::string strtext(text); std::ofstream file("/tmp/file"); const wchar_t wtext[] = L"olé" ; const std::wstring wstrtext(wtext); std::wofstream wfile("/tmp/wfile", std::ios::binary); std::cout << "sizeof(char) : " << sizeof(char) << std::endl ; std::cout << "text : " << text << std::endl ; std::cout << "sizeof(text) : " << sizeof(text) << std::endl ; std::cout << "strlen(text) : " << strlen(text) << std::endl ; std::cout << "strtext.length(): " << strtext.length() << std::endl; std::cout << "text(binary) :" ; for(size_t i = 0, iMax = strlen(text); i < iMax; ++i) { std::cout << " " << static_cast(static_cast(text[i])) ; } file << text; file << strtext; file << comma; std::cout << std::endl << comma << std::endl ; // shows the difference between C++ locale printf("%f\n", comma); // and C locale std::cout << "sizeof(wchar_t) : " << sizeof(wchar_t) << std::endl ; std::cout << "wtext : " << wtext << std::endl ; // std::cout << "wtext : UNABLE TO CONVERT NATIVELY." << std::endl ; std::cout << "sizeof(wtext) : " << sizeof(wtext) << std::endl ; std::cout << "wcslen(wtext) : " << wcslen(wtext) << std::endl ; std::cout << "wstrtext.length():" << wstrtext.length() << std::endl; std::cout << "wtext(binary) :" ; for(size_t i = 0, iMax = wcslen(wtext); i < iMax; ++i) { std::cout << " " << static_cast(static_cast(wtext[i])) ; } wfile << wtext; wfile << wstrtext; wfile << comma; std::cout << std::endl << std::endl ; return 0; }