Skip to content

Commit 51e5af5

Browse files
committed
String Conversion Cleanup
- Don't construct new locale every time - Better use of string member functions
1 parent 6328961 commit 51e5af5

1 file changed

Lines changed: 7 additions & 11 deletions

File tree

utility/string.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@ namespace Utility::Str {
99
std::string toUTF8(const std::u16string& str) {
1010
if(str.empty()) return "";
1111

12-
std::string ret;
13-
ret.resize(str.size());
12+
std::string ret(str.size(), '\0');
1413
char* pszNext;
1514
const char16_t* pwszNext;
1615
std::mbstate_t state = {0}; // zero-initialization represents the initial conversion state for mbstate_t
17-
std::locale loc("C");
18-
int res = std::use_facet<std::codecvt<char16_t, char, mbstate_t>>(loc).out(state, str.c_str(), &str[str.size()], pwszNext,
19-
&ret[0], &ret[ret.size()], pszNext);
16+
const std::codecvt_base::result& res = std::use_facet<std::codecvt<char16_t, char, mbstate_t>>(std::locale::classic()).out(
17+
state, str.data(), str.data() + str.size(), pwszNext, ret.data(), ret.data() + ret.size(), pszNext);
2018

2119
if(res == std::codecvt_base::error) return "";
2220
return ret;
@@ -26,20 +24,18 @@ namespace Utility::Str {
2624
{
2725
if(str.empty()) return u"";
2826

29-
std::u16string ret;
30-
ret.resize(str.size());
27+
std::u16string ret(str.size(), u'\0');
3128
const char* pszNext;
3229
char16_t* pwszNext;
3330
std::mbstate_t state = {0}; // zero-initialization represents the initial conversion state for mbstate_t
34-
std::locale loc("C");
35-
int res = std::use_facet<std::codecvt<char16_t, char, mbstate_t>>(loc).in(state, str.c_str(), &str[str.size()], pszNext,
36-
&ret[0], &ret[ret.size()], pwszNext);
31+
const std::codecvt_base::result& res = std::use_facet<std::codecvt<char16_t, char, mbstate_t>>(std::locale::classic()).in(
32+
state, str.data(), str.data() + str.size(), pszNext, ret.data(), ret.data() + ret.size(), pwszNext);
3733

3834
if(res == std::codecvt_base::error) return u"";
3935

4036
// Remove extra null terminators that may have been created from multi-byte
4137
// UTF-8 characters
42-
while(ret.size() > 0 && ret[ret.size() - 1] == u'\0')
38+
while(ret.ends_with(u'\0'))
4339
{
4440
ret.pop_back();
4541
}

0 commit comments

Comments
 (0)