【问题标题】:Is std::string supposed to have only Ascii characters?std::string 应该只有 Ascii 字符吗?
【发布时间】:2016-06-21 19:42:30
【问题描述】:

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

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

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

编辑:

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

【问题讨论】:

  • 绝对不能保证。 UTF-8 是一种非常流行的字符编码,如果您在这样的系统上键入“á0”,您的字符串将包含 三个 元素。
  • @MarkRansom 我明白了。我将发布另一个关于如何强制或确保输入 Ascii 字符串的问题。谢谢
  • "我有一个变量 std::string xml。编译器或 STL 是否强制内部只有 XML 字符串?" - 不。类型是“char”而不是“XML”或“Unicode”。不要混淆类型、格式或编码。那里有一个有效的问题:“如何控制标准 IO 编码?”
  • @Fozi 是的,你是对的.. 我问过这个stackoverflow.com/questions/37953843/…
  • @HumamHelfawi:我认为正确的行为是,验证如果这是您的前提条件,输入仅包含 ASCII,这很容易做到,并且失败并出现明显错误如果输入不符合您的条件,则发送消息。我认为您不能从 unicode 字符“返回”到代表用户击键的 ASCII 字符——这可能非常困难。如果您真的在问如何重新配置​​终端以使其行为不同,我认为这也将很难并且取决于平台。

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


【解决方案1】:

没有。 std::string 不包含“字符”;它包含 字节

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

您的程序需要理解它正在读取的数据的实际含义,以及它是如何编码的。这应该是你作为程序员的任务的一部分。

(不幸的是,现在还误导了 char 被命名为 char。)

【讨论】:

  • "没有被否决" 我很高兴现在没有保证。至少,有一天我可能会找到指南
  • @HumamHelfawi:假设您可以编写一个程序来解码这些指南;)
  • 你是说charbtye,即使char 是有符号类型?
  • @RSahu:当然。
  • char 是“字符”的缩写,完全具有误导性(因此提出了这个问题); byte 字面意思是类型,尽管是的,但是有一个变体具有自己有意义的高位。但是,嗯,让我们忽略带符号的字符;)假设signed char(和默认签名的char-平台上的char)是CHAR_BIT-bit 整数,并且可以使用它;)但绝不是“字符”。
【解决方案2】:

不,不能保证

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

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

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

即使你的平台使用 ASCII 编码,如果平台上的char 是无符号类型,那么它也可以很容易地保存extended ASCII characters

【讨论】:

  • 谢谢.. 如果我希望输入被视为 Ascii,我该怎么办?如果您不介意,只需一个链接即可。 (由于大量错误和不成熟的上下文,我害怕看自己)
  • @HumamHelfawi,您是在问如何防止非 ASCII 字符被读入input
  • 更准确地说,我想确保如果用户输入“a0”,我将得到一个包含两个元素的字符串。第一个是 97,第二个是 48
  • @HumamHelfawi,如果您的平台使用不同的字符编码,恐怕您必须编写代码才能做到这一点。如果您的平台使用 ASCII 编码,默认情况下您会得到。
  • std::string 可以保存的内容或std::cin 可以读取的内容甚至与“平台的编码”、ASCII 或扩展的 ASCII 无关。在ddcat someimage.jpg 的结果中尝试管道,您会看到:) 正确答案是std::string 根本没有编码的概念std::cin 也没有。
【解决方案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 或任何其他字符。但它应该是透明的,就像你如何使用它一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多