C中128..255个字符的正确处理

C中128..255个字符的正确处理,c,string,character-encoding,pointer-conversion,C,String,Character Encoding,Pointer Conversion,我需要处理一些Win-1251编码的文本(8位编码,对西里尔文使用128..255中的一些)。据我所知,C是在考虑7位ASCII的情况下创建的,没有明确支持127以上的单字节字符。所以我有几个问题: 以下哪种类型更适合此文本:char[]还是unsigned char[] 如果我对内置函数(strlen,strcmp)使用unsigned char[]),编译器会警告对char*进行隐式强制转换。这样的演员能打破什么吗?我是否应该重新实现一些函数以明确支持无符号字符字符串 C有三种不同的字符类

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

  • 以下哪种类型更适合此文本:
    char[]
    还是
    unsigned char[]
  • 如果我对内置函数(
    strlen
    strcmp
    )使用
    unsigned char[]
    ),编译器会警告对
    char*
    进行隐式强制转换。这样的演员能打破什么吗?我是否应该重新实现一些函数以明确支持
    无符号字符
    字符串

C有三种不同的字符类型,
有符号字符
无符号字符
字符
,它们可以是有符号的,也可以是无符号的。对于字符串,您应该只使用
char
,因为这将很好地处理所有内置函数。对于数值大于127的字符,它们也都能正常工作。使用
char

char*
strlen
来说应该没有问题,但是其他的,比如
isspace
,使用
无符号char
值。@EricPostischil:no.isspace take
int
。通常,单个字符作为
int
传递,以与旧的C.Yeah兼容。通常,您可以使用标准字符串函数,而不考虑字符的符号(POSIX系统和许多其他系统,其中字符是单字节)。但这只有在使用不检查字符语义的函数时才有效(例如,用于排序、检查字母数字字符等)。@GiacomoCatenazzi:正如我所写的,
isspace
,而其他
函数则采用
无符号字符
值。参数的类型当然是
int
,但根据C 2018 7.4 1,参数中的值应为非负或
EOF
:在所有情况下,参数都是
int
,其值应表示为
无符号字符
,或应等于宏
EOF
的值。如果参数有任何其他值,则行为未定义如果您有一个
char
的数组
x
,并且
char
被签名,则传递
x[i]
to
isspace
可以传递一个负值,但行为没有定义。@GiacomoCatenazzi:在另一个方向上也存在问题。例如,
fgetc
返回一个转换为
int
无符号字符。如果该值被分配给
char
,它将被转换。如果
char
是有符号的,
unsigned char
值在
char
中不可表示,行为不可移植C标准表示转换结果已实现定义或引发实现定义的信号。出于您的目的,如果编译器对char使用有符号或无符号值,您可以检查编译器。检查所有compi大多数编译器都有一个标志来更改字符的“signess”。