【问题标题】:Proper handling of 128..255 chars in C在 C 中正确处理 128..255 个字符
【发布时间】:2020-10-21 22:07:02
【问题描述】:

我需要处理一些 Win-1251 编码的文本(8 位编码,对西里尔文使用 128..255 中的一些)。据我所知,创建 C 时考虑了 7 位 ASCII,没有明确支持 127 以上的单字节字符。所以我有几个问题:

  • 哪种类型更适合此文本:char[]unsigned char[]
  • 如果我将unsigned char[] 与内置函数(strlenstrcmp)一起使用,编译器会警告char* 的隐式转换。这样的演员阵容能打破什么吗?我应该重新实现一些函数来明确支持unsigned char 字符串吗?

【问题讨论】:

  • 为了您的目的,您可以检查您的编译器,如果它使用 char 的有符号或无符号值。检查您可能使用的所有编译器。大多数编译器还有一个标志来更改 char 的“符号”。

标签: c string character-encoding pointer-conversion


【解决方案1】:

C 具有三种不同的字符类型,signed charunsigned charchar,它们可以是有符号的也可以是无符号的。对于字符串,您应该只使用char,因为它可以很好地与所有内置函数配合使用。它们也适用于数值大于 127 的字符。使用 char 应该没有问题。

【讨论】:

  • char * 适用于strlen,但其他人,如isspace,采用unsigned char 值。
  • @EricPostpischil:没有。 isspace 采取int。通常单个字符作为int 传递,以与旧C 兼容。
  • 是的。通常,您可以使用标准字符串函数,而不管 char 的符号(POSIX 系统和许多其他系统,其中 char 是单个字节)。但这仅在您使用不检查字符语义的函数时才有效(例如,用于排序、检查字母数字字符等)
  • @GiacomoCatenazzi:正如我所写,isspace 和其他 <ctype.h> 函数采用 unsigned char 。参数的类型当然是int,但其中的值应该是非负数或EOF,根据C 2018 7.4 1:“在所有情况下,参数都是@987654337 @,其值应可表示为unsigned char 或应等于宏EOF 的值。如果参数有任何其他值,则行为未定义。”如果你有一个xchar 的数组,并且char 是有符号的,则将x[i] 传递给isspace 可以传递一个负值,并且行为未定义。
  • @GiacomoCatenazzi:另一个方向也有问题。例如,fgetc 返回转换为 intunsigned char。如果将此值分配给char,则会对其进行转换。如果char 已签名并且unsigned char 值在char 中不可表示,则行为不可移植——C 标准说转换的结果是实现定义的或引发实现定义的信号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2023-02-17
相关资源
最近更新 更多