C字符串中带有特殊字符和不可打印的ASCII的奇怪性

问题描述 投票:0回答:1

我需要将c ++字符串复制到char数组中,然后对其进行解码。 char数组不需要以null终止。由于编码的性质,许多字符是不寻常的,有些字符是不可打印的,这会引起问题。

这是C ++字符串打印为: std::cout << myString; 输出:

mw\22ypwr\`himg 0few1nvnl

通过执行以下操作将其转换为char []

char * m = new char[myString.size() + 1];
strcpy(m, myString.c_str());

m*的长度为24,并且不正确。无法正确解码。以下char []可以正确解码:

char m2 [] = "mw\22ypwr`himg 0few1nvnl";

注意,这是通过复制字符串的输出创建的。但是,此C字符串的长度仅为22,而不是24。此外,打印它的结果如下:

std::cout << m;

输出:

mwypwr`himg 0few1nvnl

注意\22不见了。但是,这并不像在将字符串转换为char[]之前从字符串中删除字符串那样简单。遍历ASCII值表明存在一个字符,该字符的十进制操作码为18,以前是\22。此字符不打印。

ASCII值作为十进制:

109 119 18 121 112 119 114 96 104 105 109 103 32 48 102 101 119 49 110 118 110 108 

为什么\22转换为ASCII字符18?如何从具有文字\22的C ++字符串构造正确的,可解码的C字符串?我需要能够对一大堆可能未知的编码字符串执行此操作,因此我宁愿不要在不知道为什么会发生这种情况的情况下,用ASCII 18手动替换\22

c++ c string ascii non-ascii-characters
1个回答
0
投票

字符串包含表示octal characters的转义序列。

"mw\22ypwr\...other characters..."

\22是十进制18的八进制,因此显示每个字符的数字版本时会看到输出。

© www.soinside.com 2019 - 2024. All rights reserved.