[Boost-bugs] [Boost C++ Libraries] #5289: Library that uses Boost Filesystem would not start when the stdandard C++ library does not support the current locale

Subject: [Boost-bugs] [Boost C++ Libraries] #5289: Library that uses Boost Filesystem would not start when the stdandard C++ library does not support the current locale
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2011-03-10 14:32:40


#5289: Library that uses Boost Filesystem would not start when the stdandard C++
library does not support the current locale
---------------------------------+------------------------------------------
 Reporter: artyomtnk@… | Owner: bemandawes
     Type: Bugs | Status: new
Milestone: Boost 1.47.0 | Component: filesystem
  Version: Boost 1.46.0 | Severity: Showstopper
 Keywords: |
---------------------------------+------------------------------------------
 The standard C++ library required to support only C and POSIX locales, for
 others it may not be possible to create locale object.

 Thus std::locale("") would fail if the default system locale is not C or
 POSIX on may systems.

 For example, GCC support locales only on Linux so basically
 global_locale() would
 throw anywhere except Linux, in the Boost.Filesystem's code this means
 that it would
 not be possible to even start program under Solaris or FreeBSD.

 Even under Linux it is not possible to get to main() when linked with
 boost.filesystem shared library and the locale (LANG env. variable) is not
 supported.

 Simple test. Link the program with boost.filesystem and try to run the
 program giving LANG=foo_BAR.UTF-8 - the program would not even start. Of
 course if may happen even for legal
 locales like de_AU.UTF-8 that are not configured on this operating system.

 I had attached the patch with following changes:

 If std::locale("") fails, check if current system locale's charset is
 UTF-8, if so install
 utf-8 facet otherwise fallback to global locale.

 It would cover most of frequent cases when the standard library does not
 support the global locale
 and would not fail on locale generation, it may fail later on conversion
 if the charset is not supported. But it at least would work for ASCII
 subset.


 The second change in the attached patch is that it always tries to use
 std::locale(""), for example
 MSVC fully supports them so why would not use the default one.

 This is better then implement codecvt over Wide/Narrow API as it would not
 work correctly
 on boundaries of double width encoding like Shift-JIS or BIG5.

 For example of you have sequence "XYYZ" where X, YY and X are "characters"
 where YY is double
 width encoded character then if you would do partial conversion of "XY" it
 would return "error", rather
 then "partial" which is wrong.

 So I think it is always best idea to give a best shot do standard C++
 library rather then
 install your own facets.

 The patch is attached.

 Artyom Beilis (Author of Boost.Locale)

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/5289>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:05 UTC