2011-05-19 2 views
2

Есть ли способ сделать это красиво. Когда я пытаюсь использовать подталкивание-х to_upper(), я получаю std::bad_cast, так что я закончил что-то вроде этого:to top с char16_t array

while(str[i]!=u'\0') 
{ 
    str[i]=(char16_t)to_upper((wchar_t)str[i]); 
    i++; 
} 

Я даже не уверен, что это правильно, потому что я не знаю, если это гарантирует, что to_upperchar16_t имеет тот же размер, что и исходный символ. И я не уверен, что это вызовет перезапись следующего персонажа или повторное чтение второй половины последней прессованной. Извините за мои глупые вопросы, но у меня проблемы, когда дело доходит до произвольного доступа и типов символов, которые имеют кодировки переменной длины.

+0

Мы не знаем, если char16_t и wchar_t имеют одинаковый размер ** или ** ту же кодировку, если вы не проверить вашу конкретную систему , –

+0

О, это ад :) Есть ли чистый способ сделать это? Возможно, сначала заполнить массив tmp с верхним регистром, а затем скопировать верхнюю часть с tmp на str. – NoSenseEtAl

+0

Проблема, конечно, в том, что мы не знаем (портативно), что такое wchar_t. Вот почему мы получили новые char16_t и char32_t. Тем не менее, они получили поддержку основного языка и работают со std :: string, но не поддерживаются в остальной части библиотеки. –

ответ

2

Лучший способ сделать это, вероятно, что-то вроде этого:

char16_t upper = std::use_facet<std::ctype<char16_t>>(std::locale()).toupper(ch); 
+0

О, мой, не могли бы вы объяснить, что означает эта линия. Я не хочу скучать, но я чувствую неудобный код c/p, не понимая его. – NoSenseEtAl

+2

'ctype' - это грань (элемент локали), который классифицирует символы определенного типа. 'use_facet' использует указанный тип грани из указанной локали. Единственная проблема заключается в том, что текущий черновик C++ 0x не требует' ctype ' и 'ctype ' специализаций, поэтому он может не всегда работайте. Это по-прежнему лучший способ сделать это, о чем я могу думать. – Sven

 Смежные вопросы

  • Нет связанных вопросов^_^