Змінити кодування символу C++
Так вже довелося, що мені потрібно зробити завдання в C++ builder 6. І таке питання, як змінити маленьку літеру на велику через зміну коду символу. Так як це кирилиця, функція toUpper не допоможе. Приклад: а – А, б – Б. Я пробував так, але нічого не вийшло:
string symbol; cin >> symbol; if (symbol == 'a') < symbol -= 32; >cout
Змініть string на char. String – це рядок, масив символів в обгортці. Char – одиничний символ.
Це питання ставилося в тій чи іншій формі вже десятки разів. Подивіться у розділі "Схожі"
2 відповіді 2
На рахунок функції toupper Ви не маєте рації. Просто перед використанням функцій роботи із символами спочатку потрібно встановити локалізацію, тобто треба вказати з якою таблицею символів працюватиме функція. Ось тут все описано.
Ось приклад ближчий до вашого питання:
// locale::locale #include // std::cout #include // std::locale #include // std::runtime_error int main () < std::locale loc; // initialized to locale::classic() try < loc = std::locale ("Російський"); std::string s = "ыыыыы"; for (auto&c:s) c = std::toupper(c, loc); std::cout catch (std::runtime_error) < loc = std::locale (loc, "", std::locale::ctype); >std::cout
При установці локалізації (Докладніше тут) потрібно розуміти, яке кодування потрапляє на вхід. Якщо це зовнішні дані, то потрібно знати, в якому кодуванні вони надходять. Наприклад, під час введення з консолі це може бути 866(OEM) сторінка, а програма очікує 1251(ANSI). Для цього потрібно явно вказати кодування. Наприклад:
loc = std::locale ("Russian_Russia.866");
locale loc ("Російський"); s[position] = toupper(s[position], loc); При такому записі літери а - п не переводить взагалі, а символи ф - я переводить у крокозябри ( ф переклало на _ )
Борландівська toUpper в білдері швидше за все не те ж саме, що бібліотечна toupper. Цілком можливо, що борландська toUpper працює не звертаючи уваги на локаль.Транслятор досить древній і тоді підтримки локалі добре не робили.
@pepsicoca1 В даному випадку людина використовує std::string і std::cin як би логічно, що і toupper має бути стандартним.
@Andrey Sv Саме людина пише про toUpper. Це борландівська функція. Це не те ж саме, що toupper з бібліотеки С++. Це навіть не функція Борланд, а метод для рядків борландів (якщо мені не змінює мій склероз).
Приклад для латиниці, але для кирилиці теж працюватиме.
Я роблю так, хоча мене за це і лають деякі громадяни.
Можливо, комусь здається, що це не дуже красиво, зате рішення на 101% портабельне.
Працюватиме на всіх кодуваннях, і на ASCII, і на EBCDIC і на будь-якому іншому.
Для кирилиці працюватиме і на КОІ, і на CP1251, і на Юнікоді.
char my_to_upper(char ch) < char retchar; switch (ch) <case 'a': retchar = 'A'; break; case 'b': retchar = 'B'; break; case 'c':retchar='C';break; case 'd': retchar = 'D'; break; case 'e': retchar = 'E'; break; case 'f':retchar='F';break; case 'g': retchar = 'G'; break; case 'h': retchar = 'H'; break; case 'i': retchar = 'I'; break; case 'j': retchar = 'J'; break; case 'k': retchar = 'K'; break; case 'l': retchar = 'L'; break; case 'm': retchar = 'M'; break; case 'n': retchar = 'N'; break; case 'o':retchar='O';break; case 'p': retchar = 'P'; break; case 'q': retchar = 'Q'; break; case 'r': retchar = 'R'; break; case 's': retchar = 'S'; break; case 't': retchar = 'T'; break; case 'u': retchar = 'U'; break; case 'v':retchar='V';break; case 'w':retchar='W';break; case 'x': retchar = 'X'; break; case 'y': retchar = 'Y'; break; case 'z': retchar = 'Z'; break; default: retchar = ch; break; >return retchar; >
Найчастіше для кирилиці це працюватиме, т.к. літери в більшості випадків займають > 1 байта, а розмір char у більшості випадків дорівнює 1 байту - Tocic 5 хвилин тому
Не, ну для Юнікод, звичайно, треба брати тип wchar_t.
Якщо вхідний символ wchar_t, то вихідний символ, природно, теж буде wchar_t.
Ідея в тому, що схема зі switch працюватиме і для всіх типів символів (у тому числі і для wchar_t), і для всіх кодувань.
Зрештою, якщо бути пуристом, можна зробити шаблон.
template T my_to_upper(T ch) < T retchar; switch (ch) <case 'a': retchar = 'A'; break; case 'b': retchar = 'B'; break; case 'c':retchar='C';break; case 'd': retchar = 'D'; break; case 'e': retchar = 'E'; break; case 'f':retchar='F';break; case 'g': retchar = 'G'; break; case 'h': retchar = 'H'; break; case 'i': retchar = 'I'; break; case 'j': retchar = 'J'; break; case 'k': retchar = 'K'; break; case 'l': retchar = 'L'; break; case 'm': retchar = 'M'; break; case 'n': retchar = 'N'; break; case 'o':retchar='O';break; case 'p': retchar = 'P'; break; case 'q': retchar = 'Q'; break; case 'r': retchar = 'R'; break; case 's': retchar = 'S'; break; case 't': retchar = 'T'; break; case 'u': retchar = 'U'; break; case 'v':retchar='V';break; case 'w':retchar='W';break; case 'x': retchar = 'X'; break; case 'y': retchar = 'Y'; break; case 'z': retchar = 'Z'; break; default: retchar = ch; break; >return retchar; >
Для кирилиці в кодуванні CP1251 (яка використовується в Борланд 6.0 Білдер), буде працювати і варіант з char.
Ваш код для char можна записати як return symbol <65 || symbol >122? symbol : ((char)(((int)symbol) + 32)); – LLENN 10 секунд тому
Це буде працювати для кодування ASCII. Але, наприклад, для кодування EBCDIC це не працюватиме.
@ pepsicoca1 '. ' - це літерал типу char – Tocic 10 хвилин тому
Правильно, але на цей випадок ми маємо switch з гвинтом.
wchar_t my_to_upper(wchar_t ch) < wchar_t retchar; switch (ch) <case L'a': retchar = L'A'; break; case L'b': retchar = L'B'; break; case L'c': retchar = L'C'; break; case L'd':retchar=L'D';break; case L'e': retchar = L'E '; break; case L'f': retchar = L'F'; break; case L'g': retchar = L'G'; break; case L'h': retchar = L'H'; break; case L'i': retchar = L'I'; break; case L'j':retchar=L'J';break; case L'k': retchar = L'K'; break; case L'l': retchar = L'L'; break; case L'm': retchar = L'M'; break; case L'n': retchar = L'N'; break; case L'o': retchar = L'O'; break; case L'p': retchar = L'P'; break; case L'q': retchar = L'Q'; break; case L'r': retchar = L'R'; break; case L's': retchar = L'S'; break; case L't': retchar = L'T'; break; case L'u': retchar = L'U'; break; case L'v': retchar = L'V'; break; case L'w': retchar = L'W '; break; case L'x': retchar = L'X'; break; case L'y': retchar = L'Y'; break; case L'z': retchar = L'Z'; break; default: retchar = ch; break; >return retchar; >
/utf-8 (Задайте для вихідних та виконуваних наборів символів значення UTF-8)
Цей параметр можна використовувати /utf-8 для вказівки вихідних та символьних наборів виконання у кодуванні за допомогою UTF-8. Це еквівалентно /source-charset:utf-8 /execution-charset:utf-8 вказівку у командному рядку. Будь-який із цих параметрів також включає /validate-charset параметр за промовчанням. Список підтримуваних ідентифікаторів кодової сторінки та імен наборів символів див. у розділі "Ідентифікатори кодової сторінки".
За промовчанням Visual Studio виявляє мітку порядку байтів, щоб визначити, чи є вихідний файл у форматі Юнікоду, наприклад UTF-16 або UTF-8. Якщо мітка порядку байтів не знайдена, передбачається, що вихідний файл закодований на поточній сторінці користувача, якщо тільки ви не вказали кодову сторінку або /utf-8
/source-charset параметр. Visual Studio дозволяє зберігати вихідний код C++ у кожному з кількох кодувань символів. Відомості про набори символів джерела та виконання див. у документації з мови.
Встановлення параметра у Visual Studio або програмним способом
Встановлення цього параметра компілятора у середовищі розробки Visual Studio
- Відкрийте діалогове вікно Вікна властивостей проекту. Докладніше див. у статті Налаштування компілятора C++ та властивостей збирання у Visual Studio.
- Перейдіть на сторінку властивостей Властивості конфігурації>C/C++>Командний рядок.
- У розділ "Додаткові параметри" додайте параметр, щоб вказати /utf-8 перевагу кодування.
- Натисніть ОК, щоб зберегти зміни.
Встановлення цього параметра компілятора програмним способом