diff options
author | artemp <artem@mapnik.org> | 2014-10-31 14:43:46 -0400 |
---|---|---|
committer | artemp <artem@mapnik.org> | 2014-10-31 14:43:46 -0400 |
commit | ea2416c7cf0bc1bc745dd4d219057d9d979a2dbe (patch) | |
tree | 2f70fa896d57247e82890bc8b409b3769ce31a78 /platform/default/string_stdlib.cpp | |
parent | 15cf30652cf6b6d9a52bc6eb9815fd2e19ab78e3 (diff) | |
download | qtlocation-mapboxgl-ea2416c7cf0bc1bc745dd4d219057d9d979a2dbe.tar.gz |
use nunicode for proper to_upper/to_lower string conversions
Diffstat (limited to 'platform/default/string_stdlib.cpp')
-rw-r--r-- | platform/default/string_stdlib.cpp | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/platform/default/string_stdlib.cpp b/platform/default/string_stdlib.cpp index 1acbfa8508..d2c02e2881 100644 --- a/platform/default/string_stdlib.cpp +++ b/platform/default/string_stdlib.cpp @@ -1,24 +1,51 @@ #include <mbgl/platform/platform.hpp> - -#include <locale> +#include <mbgl/util/utf.hpp> +#define NU_WITH_TOUPPER +#define NU_WITH_TOLOWER +#define NU_WITH_UTF8_WRITER +#include <libnu/libnu.h> namespace mbgl { namespace platform { -std::string uppercase(const std::string& string) { - // TODO: Use a proper Unicode Special Casing-aware algorithm. - const auto &convert = std::use_facet<std::ctype<char>>(std::locale()); - std::string converted = string; - convert.toupper(&converted[0], &converted[0] + converted.size()); - return converted; +std::string uppercase(const std::string& str) +{ + boost::u8_to_u32_iterator<std::string::const_iterator> itr(str.begin()); + boost::u8_to_u32_iterator<std::string::const_iterator> end(str.end()); + std::string output; + char buf[4]; + for (; itr!=end; ++itr) + { + char const* up = nu_toupper(*itr); + if (up != 0) output.append(up); + else + { + std::memset(buf, 0, 4); + nu_utf8_write(*itr, buf); + output.append(buf); + } + } + return output; } -std::string lowercase(const std::string& string) { - // TODO: Use a proper Unicode Special Casing-aware algorithm. - const auto &convert = std::use_facet<std::ctype<char>>(std::locale()); - std::string converted = string; - convert.tolower(&converted[0], &converted[0] + converted.size()); - return converted; +std::string lowercase(const std::string& str) +{ + boost::u8_to_u32_iterator<std::string::const_iterator> itr(str.begin()); + boost::u8_to_u32_iterator<std::string::const_iterator> end(str.end()); + std::string output; + char buf[4]; + for (; itr!=end; ++itr) + { + char const* up = nu_tolower(*itr); + if (up != 0) output.append(up); + else + { + std::memset(buf, 0, 4); + nu_utf8_write(*itr, buf); + output.append(buf); + } + } + return output; } } |