如何在 C++ 中获取 Windows-1252 个字符值?

How to get Windows-1252 character values in c++?

我有一个奇怪的输入文件,其中包含各种控制字符,例如空值。我想从此 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
}

它也会把 é 变成 space。

所以如果你有这样一个字符串,编码为 Windows-1252:

std::string test="tést";

十六进制值为:

t  é  s  t
74 E9 73 74

https://en.wikipedia.org/wiki/ASCII and https://en.wikipedia.org/wiki/Windows-1252

test[0] 等于十进制 116 (=0x74),但显然对于 é/0xE9,test[1] 不等于十进制值 233。

那么如何正确识别 é 呢?

改变

if (test[i]<32)

if (test[i] >= 0 && test[i] < 32)

字符通常是有符号类型,0xE9 是八位整数中的负值。

32 是一个有符号整数,比较 char 和有符号整数是由编译器按有符号执行的:E9 (-23)<32 其中 return 为真。

使用 32 的无符号文字,即 32u 对无符号值进行比较:E9 (233) < 32 其中 return 为假。

替换:

if (test[i]<32) test[i]=32;

作者:

if (test[i]<32u) test[i]=32u;

你应该会得到预期的结果。

在这里测试: https://onlinegdb.com/BJ8tj0kbd

注意:您可以检查 char 是否使用以下代码签名:

#include <limits>
...
std::cout << std::numeric_limits<char>::is_signed << std::endl;