【问题标题】:0xc2 character in std::stringstd::string 中的 0xc2 字符
【发布时间】:2018-11-24 05:47:23
【问题描述】:

以下字符串的大小是 4 而不是我预期的 3。

std::string s = "\r\n½"; 
int ss = s.size(); //ss is 4

当逐个字符循环遍历字符串时,将其转义为十六进制我得到

  • 0x0D(回车的十六进制代码)
  • 0x0A(换行的十六进制代码)
  • 0xc2(十六进制代码,但这是什么?)
  • 0xbd(½ 字符的十六进制代码)

0xc2 来自哪里? 它是某种编码信息吗?我虽然 std::string 在字符串中每个可见字符都有一个字符。有人可以确认 0xc2 是“字符集修饰符”吗?

【问题讨论】:

  • 您的文件被编码为 UTF-8,而您的编译器将其读取为 UTF-8,因此 ½ 被转换为其 UTF-8 二进制表示,即 0xC2DB。 C++不关心原始编码,它关心的是构造s时内存中的内容,而内存中的内容是0D0AC2BD,所以s是用4个字节构造的(在你的情况下是4个char) .这就是为什么你会得到这个结果。如果文件使用不同的编码进行编码,或者char 的长度为 2 个字节,您将得到不同的结果。

标签: c++ char stdstring


【解决方案1】:

“½”在 unicode 中具有代码点 U+00BD,并由 UTF-8 由两个字节序列 0xc2bd 表示。这意味着,您的字符串仅包含三个字符,但长度为四个字节。

https://www.fileformat.info/info/unicode/char/00bd/index.htm

关于 SO 的补充阅读:std::wstring VS std::string

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 2016-03-29
    • 2011-01-14
    • 2014-01-25
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多