diff options
author | Mike Antipov <mantipov@productengine.com> | 2010-07-23 10:26:28 +0300 |
---|---|---|
committer | Mike Antipov <mantipov@productengine.com> | 2010-07-23 10:26:28 +0300 |
commit | 3c4f82b2984c0cf70b2bc61190495cf9cf1a6aad (patch) | |
tree | 54e39bcaa704c80d9ad2c99d74928f91ea50b74e /indra/llcommon/llstring.cpp | |
parent | f6c08d45108d713fc42786885d1d38a4b95c10ac (diff) |
EXT-8318 ADDITIONAL FIXED ensure that thousands separator is in utf8 format (on Windows) before converting it to LLWString.
Problem on Windows:
==================
LLPanelMainInventory::updateItemcountText() formats number using viewer locale.
non-break space is detected as unknown symbols while converting utf8str_to_wstring when formatted text is set to LLTextBox.
FIX:
===
Added converting of string to multi-byte string and then to utf8 string while formatting on Windows.
created opposite to "ll_convert_wide_to_string" function "ll_convert_string_to_wide" and helper function to call both of them.
It is used now to convert result of formatted string while formatting integer number in locale.
Fix affects Windows only.
Reviewed by Richard Nelson at https://codereview.productengine.com/secondlife/r/775/
--HG--
branch : product-engine
Diffstat (limited to 'indra/llcommon/llstring.cpp')
-rw-r--r-- | indra/llcommon/llstring.cpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 1561bda201..804c00fd60 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -633,14 +633,14 @@ namespace snprintf_hack } } -std::string ll_convert_wide_to_string(const wchar_t* in) +std::string ll_convert_wide_to_string(const wchar_t* in, unsigned int code_page) { std::string out; if(in) { int len_in = wcslen(in); int len_out = WideCharToMultiByte( - CP_ACP, + code_page, 0, in, len_in, @@ -655,7 +655,7 @@ std::string ll_convert_wide_to_string(const wchar_t* in) if(pout) { WideCharToMultiByte( - CP_ACP, + code_page, 0, in, len_in, @@ -669,6 +669,31 @@ std::string ll_convert_wide_to_string(const wchar_t* in) } return out; } + +wchar_t* ll_convert_string_to_wide(const std::string& in, unsigned int code_page) +{ + int output_str_len = MultiByteToWideChar(code_page, 0, in.c_str(), in.length(), NULL, 0); + + // reserve place to NULL terminator + wchar_t* w_out = new wchar_t[output_str_len + 1]; + + memset(w_out, 0, output_str_len + 1); + MultiByteToWideChar (code_page, 0, in.c_str(), in.length(), w_out, output_str_len); + + //looks like MultiByteToWideChar didn't add null terminator to converted string, see EXT-4858. + w_out[output_str_len] = 0; + + return w_out; +} + +std::string ll_convert_string_to_utf8_string(const std::string& in) +{ + wchar_t* w_mesg = ll_convert_string_to_wide(in, CP_ACP); + std::string out_utf8 = ll_convert_wide_to_string(w_mesg, CP_UTF8); + delete[] w_mesg; + + return out_utf8; +} #endif // LL_WINDOWS long LLStringOps::sPacificTimeOffset = 0; |