wconversions.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //
  2. // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. //
  9. // ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
  10. //
  11. // BIG FAT WARNING FOR Microsoft Visual Studio Users
  12. //
  13. // YOU NEED TO CONVERT THIS SOURCE FILE ENCODING TO UTF-8 WITH BOM ENCODING.
  14. //
  15. // Unfortunately MSVC understands that the source code is encoded as
  16. // UTF-8 only if you add useless BOM in the beginning.
  17. //
  18. // So, before you compile "wide" examples with MSVC, please convert them to text
  19. // files with BOM. There are two very simple ways to do it:
  20. //
  21. // 1. Open file with Notepad and save it from there. It would convert
  22. // it to file with BOM.
  23. // 2. In Visual Studio go File->Advances Save Options... and select
  24. // Unicode (UTF-8 with signature) Codepage 65001
  25. //
  26. // Note: once converted to UTF-8 with BOM, this source code would not
  27. // compile with other compilers, because no-one uses BOM with UTF-8 today
  28. // because it is absolutely meaningless in context of UTF-8.
  29. //
  30. // ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
  31. //
  32. #include <boost/locale.hpp>
  33. #include <boost/algorithm/string/case_conv.hpp>
  34. #include <iostream>
  35. #include <ctime>
  36. int main()
  37. {
  38. using namespace boost::locale;
  39. using namespace std;
  40. // Create system default locale
  41. generator gen;
  42. locale loc=gen("");
  43. locale::global(loc);
  44. wcout.imbue(loc);
  45. // This is needed to prevent C library to
  46. // convert strings to narrow
  47. // instead of C++ on some platforms
  48. std::ios_base::sync_with_stdio(false);
  49. wcout<<L"Correct case conversion can't be done by simple, character by character conversion"<<endl;
  50. wcout<<L"because case conversion is context sensitive and not 1-to-1 conversion"<<endl;
  51. wcout<<L"For example:"<<endl;
  52. wcout<<L" German grüßen correctly converted to "<<to_upper(L"grüßen")<<L", instead of incorrect "
  53. <<boost::to_upper_copy(std::wstring(L"grüßen"))<<endl;
  54. wcout<<L" where ß is replaced with SS"<<endl;
  55. wcout<<L" Greek ὈΔΥΣΣΕΎΣ is correctly converted to "<<to_lower(L"ὈΔΥΣΣΕΎΣ")<<L", instead of incorrect "
  56. <<boost::to_lower_copy(std::wstring(L"ὈΔΥΣΣΕΎΣ"))<<endl;
  57. wcout<<L" where Σ is converted to σ or to ς, according to position in the word"<<endl;
  58. wcout<<L"Such type of conversion just can't be done using std::toupper that work on character base, also std::toupper is "<<endl;
  59. wcout<<L"not fully applicable when working with variable character length like in UTF-8 or UTF-16 limiting the correct "<<endl;
  60. wcout<<L"behavoir to BMP or ASCII only"<<endl;
  61. }
  62. // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
  63. // boostinspect:noascii