Я использую следующий код для преобразования в верхнем регистре. Строки в моем программном обеспечении кодируются UTF8. Следующий код отлично работает в Windows, AIX и Linux (все 64 бит), однако он не работает в Solaris (SunOS 5.10 Generic_147440-01 sun4u sparc SUNW, SPARC-Enterprise).C++ Solaris Преобразование в верхнем регистре для специальных символов не работает
В Solaris специальные символы, такие как «ä», не преобразуются в их верхний регистр. Однако символы ASCII, такие как «a», «b» и т. Д., Преобразуются правильно в верхний регистр.
void String::MakeUpperUTF8()
{
WCHAR *pwstr = GetUnicode(); // Decode UTF8 encoded string to wide char string using iconv
if (!pwstr)
{
return; // return if decode fails.
}
std::locale::global(std::locale(""));
const std::ctype<WCHAR>& f = std::use_facet< std::ctype<WCHAR> >(std::locale()); // using std //ctype facet and std locale convert string to uppercase
f.toupper(pwstr, pwstr + wcslen(pwstr));
char *strPos = SetUnicode(pwstr, -1); // encode string back to UTF8
}
Не могли бы вы помочь мне. Мне интересно, почему этот код не работает на Solaris.
Что вы локаль по умолчанию? –
Можете ли вы привести пример к результату, который у вас есть? например, если вы укажете вход «ä» (c3 a4), какой символ (и значение) у вас есть вместо «Ä» (c3 84)? – SHR
Моей установкой по умолчанию является en_US.UTF-8. Ниже из положить команды локали на Солярис: LANG = en_US.UTF-8 LC_CTYPE = "en_US.UTF-8" LC_NUMERIC = "en_US.UTF-8" LC_TIME = "en_US.UTF-8" LC_COLLATE = "en_US.UTF-8" LC_MONETARY = "en_US.UTF-8" LC_MESSAGES = "en_US.UTF-8" LC_ALL = en_US.UTF-8 – user1565291