【问题标题】:How to get Windows-1252 character values in c++?如何在 C++ 中获取 Windows-1252 字符值?
【发布时间】: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/ASCIIhttps://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]&lt;' ')
  • @PanagiotisKanavos,我同意,但与int 相比,循环中可能发生的事情

标签: c++ extended-ascii


【解决方案1】:

32 是一个有符号整数,将char 与有符号整数进行比较由编译器执行为有符号:E9 (-23)

使用32 的无符号文字,即32u,对无符号值执行比较:E9 (233)

替换:

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;

【讨论】:

【解决方案2】:

改变

if (test[i]<32)

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

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

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2012-07-16
    • 2016-05-16
    • 1970-01-01
    • 2019-08-19
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多