2016-06-21 3 views
1

Предполагается, что std::string должен содержать набор символов в кодировке Ascii на всех платформах и стандартных компиляторах?Строка std :: string должна иметь только символы Ascii?

Другими словами, я могу быть уверен, что моя C++ программе получит набор символов ASCII, если я это сделать:

std::string input; 
std::getline(std::cin, input); 

EDIT:

В более точных слов, я хочу чтобы убедиться, что если пользователь вводит "a0", я получу std::string с двумя элементами. Первый 97 и второй 48

+2

Там нет абсолютно никакой гарантии.UTF-8 - очень популярная кодировка символов, и если вы наберете «0» в такой системе, ваша строка будет содержать * три * элемента. –

+0

@MarkRansom Я вижу .. Я отправлю еще один вопрос о том, как я могу заставить или обеспечить ввод строки Ascii. Спасибо –

+0

«У меня есть переменная' std :: string xml'. Использует ли компилятор или STL, что внутри есть только строки XML? » - Нет. Тип «char» не «XML» или «Unicode». Не путайте тип, формат или кодировку. Однако есть веский вопрос: «Как я могу контролировать стандартную кодировку IO?» – Fozi

ответ

2

Нет, нет никакой гарантии, что

std::string input; 
std::getline(std::cin, input); 

будет возвращать только символы ASCII. Диапазон значений, который удерживается char, не ограничивается символами ASCII.

Если ваша платформа использует различную кодировку, отличную от ASCII, вы, очевидно, получите другой набор символов.

Даже если ваша платформа использует кодировку ASCII, если char на платформе является неподписанным типом, то он может очень легко удерживать extended ASCII characters.

+0

Спасибо .. Что я могу сделать, если я хочу, чтобы вход обрабатывался как Ascii? просто ссылка поможет, если вы не возражаете. (Я боюсь смотреть на себя из-за множества неправильных и не зрелых контекстов) –

+0

@HumamHelfawi, вы спрашиваете, как вы можете запретить чтение не-ASCII-символов в 'input'? –

+0

В более точных словах я хочу убедиться, что если пользователь вводит «a0», я получу строку с двумя элементами. Первый - 97, а второй - 48 –

3

Другими словами, я могу быть уверен, что моя C++ программа получит набор символов ASCII, если я это сделать ...

No. std::string на самом деле специализация для std::basic_string<>, как
using std::string std::basic_string<char>;:

template< 
    class CharT, 
    class Traits = std::char_traits<CharT>, 
    class Allocator = std::allocator<CharT> 
> class basic_string; 

и может содержать любой тип символа, который определяется с Traits.

Короче говоря, std::string может содержать кодировки символов ASCII, а также EBCDIC или любые другие. Но он должен быть прозрачным, как вы его используете.

6

std::string не содержит символов; он содержит байт.

Эти байты могут формировать некоторую удобочитаемую пользователем строку через кодировку как ASCII или EDBCIC или Unicode. Они могут быть двоичным кодированием, хранящим машиночитаемую информацию (например, изображение в формате JPEG). Они могут быть руководящими принципами инопланетян о том, как использовать Stack Overflow в течение трех недель подряд, не опуская ни одного даже одного раза. Они могут быть суммарным случайным белым шумом.

Ваша программа должна быть сделана для понимания того, что на самом деле означает данные, которые она читает, и как она кодируется. Это должно быть частью вашей задачи в качестве программиста.

(Это печально, и в настоящее время вводит в заблуждение, что char называется char.)

+0

«без поддержки» Я счастлив, что нет никакой гарантии. По крайней мере, я могу найти рекомендации когда-нибудь –

+0

@HumamHelfawi: Предполагая, что вы можете написать программу для декодирования этих рекомендаций;) –

+0

Вы говорите, что 'char' является' btye', даже если 'char' является подписанным типом? –

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