【发布时间】:2021-02-09 09:10:32
【问题描述】:
我有一个奇怪的输入文件,其中包含各种控制字符,例如空值。我想从这个 Windows-1252 编码的文本文件中删除所有控制字符,但如果你这样做:
std::string test="tést";
for (int i=0;i<test.length();i++)
{
if (test[i]<32) test[i]=32; // change all control characters into spaces
}
它也会把 é 变成一个空格。
所以如果你有这样的字符串,在 Windows-1252 中编码:
std::string test="tést";
十六进制值是:
t é s t
74 E9 73 74
见https://en.wikipedia.org/wiki/ASCII和https://en.wikipedia.org/wiki/Windows-1252
test[0] 将等于十进制 116 (=0x74),但显然对于 é/0xE9,test[1] 不等于十进制值 233。
那么你怎么能正确识别那个é呢?
【问题讨论】:
-
It will change the é into a space as well.不,它不会,因为正如您发布的那样,é 的十六进制值远高于 32。发布实际重现问题的内容,不要描述您的代码。 Latin1/Windows-1252 没有什么特别之处。发布一些其他人可以在他们自己的机器上执行并获得您描述的结果,而无需添加缺失的代码或手动进行比较。 -
@PanagiotisKanavos 根据具体情况,它可能是一个负值。
-
@anastaciu 不,因为
char不是数字。它有时被视为无符号字节值,这可能导致各种奇怪的错误,但 C++ 不鼓励这种 C 风格的使用。这就是为什么人们应该将字符与字符进行比较,而不是数字。32不是' '。 -
至少与空格字符比较,
' ',而不是 ASCII 值:if (test[i]<' ') -
@PanagiotisKanavos,我同意,但与
int相比,循环中可能发生的事情
标签: c++ extended-ascii