std :: string应该只有Ascii字符吗?

时间:2016-06-21 19:42:30

标签: c++ string c++11 ascii

std::string是否应该在所有平台和标准编译器上以Ascii编码保存一组字符?

换句话说,如果我这样做,我可以确定我的C ++程序将获得一组Ascii字符:

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

修改

更确切地说,我想确保如果用户输入"a0",我会得到一个包含两个元素的std::string。第一个是97,第二个是48

3 个答案:

答案 0 :(得分:6)

否。 std::string没有"字符&#34 ;;它包含 bytes

这些字节可以通过ASCII或EDBCIC或Unicode编码形成一些人类可读的字符串。它们可以是存储计算机可读信息(例如JPEG图像)的二进制编码。它们可能是外星人关于如何连续三周使用Stack Overflow而不被贬低甚至一次的指导。它们可能是完全随机的白噪声。

您的程序需要了解它所读取的数据实际意味着什么,以及它是如何编码的。这应该是程序员的任务的一部分。

(很不幸,现在误导,char被命名为char。)

答案 1 :(得分:3)

不,不能保证

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

将仅返回ASCII字符。 char保留的值范围不限于ASCII字符。

如果您的平台使用的编码与ASCII不同,那么您显然会得到一组不同的字符。

即使您的平台使用ASCII编码,如果平台上的char是无符号类型,也可以非常轻松地保留extended ASCII characters

答案 2 :(得分:3)

  

换句话说,如果我这样做,我可以确定我的C ++程序会得到一组Ascii字符......

没有。 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或任何其他编码。但它应该是透明的,就像你如何使用它一样。