std::string
是否应该在所有平台和标准编译器上保存Ascii编码字符集?
换句话说,如果我这样做,我的C++程序是否可以确保获取一组Ascii字符:
std::string input;
std::getline(std::cin, input);
编辑:
更准确地说,我想确保如果用户输入"a0"
,我将获得一个包含两个元素的std::string
。第一个元素是97
,第二个元素是48
。
std::string
并不是存储"字符",它存储的是字节。
这些字节可以通过 ASCII、EDBCIC 或 Unicode 编码形成人类可读的字符串。它们也可以是二进制编码存储计算机可读信息(例如 JPEG 图像)。它们甚至可以是外星人给你关于如何在 Stack Overflow 上三周不被踩的指引。或者是完全随机的白噪声。char
的命名可能会误导人。)char
是有符号类型,它也是一个byte
吗? - R Sahuchar
缩写自"character",这完全是误导(因此有了这个问题);byte
字面上就是该类型的含义,尽管确实有一个带有自己含义的上位比特变体。但是咳咳,我们就忽略带符号的chars吧 ;) 让我们假设signed char
(以及默认带符号char
平台上的char
)是一个CHAR_BIT
位整数,然后就完成了 ;) 但从不是"字符"。 - Lightness Races in Orbitstd::string input;
std::getline(std::cin, input);
只会返回ASCII字符。 char
可以容纳的值的范围不仅限于ASCII字符。
如果您的平台使用与ASCII不同的编码,则显然会得到不同的字符集。
即使您的平台使用ASCII编码,如果平台上的char
是无符号类型,则它也可以非常容易地容纳扩展的ASCII字符。
std::string
可以保存任何内容,std::cin
可以读取任何内容,与所用的平台编码、ASCII 或扩展 ASCII 没有任何关系。如果尝试使用 dd
的结果或 cat someimage.jpg
进行输入,就会发现这一点。正确的答案是:std::string
完全没有编码概念。std::cin
也是如此。 - Lightness Races in Orbitchar
是有符号还是无符号,它都可以容纳扩展字符集,而不仅仅是 ASCII。 - Mark Ransomstd::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或其他任何编码。但是在使用时应该透明无感知。
std::string xml
。编译器或STL是否强制要求其中只有XML字符串?- 不是的。类型是`char'而不是"XML"或"Unicode"。不要混淆类型、格式或编码。但是其中确实有一个有效的问题:“我如何控制标准IO编码?” - Fozi