Здравствуйте, YourLastSong, Вы писали:
YLS>Здравствуйте, господа.
YLS>Я снова обращаюсь к вам с довольно глупым вопросом — как можно использовать русские буквы в case?
вопрос не столько глупый, сколько непонятный
YLS>Заранее благодарю за возможные ответы.
Здравствуйте, YourLastSong, Вы писали:
YLS>Мне необходимо сделать что-нибудь наподобие:
YLS>case 'а': YLS>... YLS>case 'б': YLS>...
YLS>У меня почему-то так не работает.
Если у тебя исходник, например, в cp1251, а входные данные, скажем, в UTF8 и ты его вот так проверяешь, то естественно работать не будет.
Здравствуйте, YourLastSong, Вы писали:
YLS>Здравствуйте, господа.
YLS>Я снова обращаюсь к вам с довольно глупым вопросом — как можно использовать русские буквы в case?
YLS>Заранее благодарю за возможные ответы.
У меня работает вот так:
case L'ж':
...
case L'ф':
Но я не советую Вам так делать, хоть это и возможно.
Дело в том, что кодировка исходного файла может быть разной.
Соответственно, коды символов будут разными и получится результат,
отличный от ожидаемого.
Вообще, аспекты программы, связанныме с различиями в языках и локализациях,
лучше обрабатывать особым образом. Например, в Windows для этого есть секции ресурсов.
O>Но я не советую Вам так делать, хоть это и возможно. O>Дело в том, что кодировка исходного файла может быть разной. O>Соответственно, коды символов будут разными и получится результат, O>отличный от ожидаемого.
Как раз вот эта проблема.
Что-то ещё сделать можно, помимо того способа, который вы уже назвали.
Здравствуйте, YourLastSong, Вы писали:
YLS>Простите за столь глупый для вас вопрос, но как это исправить можно?
Всегда удивляло желание себя попринижать. Не надо. Вопрос совсем не глупый. И простого и однозначного способа это исправить нет.
1. смотри ответ
.
2. стоит почитать про wide char.
3. стоит почитать про setlocale, std::locale, std::codecvt.
4. стоит посмотреть на подход, который используется в Qt (для самообразования в первую очередь).
5. стоит посмотреть библиотеку iconv.
Здравствуйте, YourLastSong, Вы писали:
YLS>Что-то ещё сделать можно, помимо того способа, который вы уже назвали.
Символьные литералы можно записать в виде кодов соответствующих символов.
По крайней мере, не будет сюрпризов из-за возможного перекодирования исходных файлов.
Здравствуйте, YourLastSong, Вы писали:
O>>Символьные литералы можно записать в виде кодов соответствующих символов.
YLS>Можно сылку на коды? А то уже какие-то коды пробовал вроде, не получилось.
Получается, мне необходимо изменить char на wchar_t, а также использовать все функции, связанные с ними?
Честно говоря, если вы не сочтёте это за наглость, мне было бы гораздо легче, если бы вы привели небольшой пример, что можно сделать в моём случае, а я уже поищу тогда, что означает каждая из этих строчек, если будет что-то непонятное.
Здравствуйте, YourLastSong, Вы писали:
O>>Символьные литералы можно записать в виде кодов соответствующих символов.
YLS>Можно сылку на коды? А то уже какие-то коды пробовал вроде, не получилось.
Если я правильно понял, то например, http://en.wikipedia.org/wiki/Windows-1251
используя коды символов можно будет вместо
case 'a':
case 'б':
написать
case 0xE0: // символ 'а' в кодировке cp1251
case 0xE1: // символ 'б' в кодировке cp1251
тогда не будет проблем с тем, в какой кодировке у Вас исходные файлы. можно в cp1251, можно в uft-8
но Вы должны четко понимать, что входной текст или отдельные символы (которые, например, пользователь вводит с клавиатуры), должны быть в той же кодировке, что и коды символов в case. если пользователь ввел символ "а" в кодировке cp866 (код 0xA0), то соответствующий case не отработает, хотя должен, т.к. "пользователь ввел символ 'а'".
Здравствуйте, YourLastSong, Вы писали:
YLS>Получается, мне необходимо изменить char на wchar_t, а также использовать все функции, связанные с ними?
При использовании Юникода уходит множество проблем, таких как определение кодовой страницы, например.
А некоторые программные интерфейсы вообще работают только с Юникодом.
Так что этот вопрос давно уже перестал быть делом вкуса. Выбирайте UTF-16 или UTF-8, в зависимости от
платформы, под которую пишете, и эти проблемы Вас никогда не коснутся.
YLS>Честно говоря, если вы не сочтёте это за наглость, мне было бы гораздо легче, если бы вы привели небольшой пример, что можно сделать в моём случае, а я уже поищу тогда, что означает каждая из этих строчек, если будет что-то непонятное.
Можно, а стоит ли ?
У Вас же есть компилятор, наверняка еще какая-то литература — вот их и "спросите".
Будет намного больше пользы.