C中128..255个字符的正确处理
我需要处理一些Win-1251编码的文本(8位编码,对西里尔文使用128..255中的一些)。据我所知,C是在考虑7位ASCII的情况下创建的,没有明确支持127以上的单字节字符。所以我有几个问题: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有三种不同的字符类
- 以下哪种类型更适合此文本:
还是char[]
unsigned char[]
- 如果我对内置函数(
,strlen
)使用strcmp
),编译器会警告对unsigned char[]
进行隐式强制转换。这样的演员能打破什么吗?我是否应该重新实现一些函数以明确支持char*
字符串无符号字符
有符号字符
、无符号字符
和字符
,它们可以是有符号的,也可以是无符号的。对于字符串,您应该只使用char
,因为这将很好地处理所有内置函数。对于数值大于127的字符,它们也都能正常工作。使用char
char*
对strlen
来说应该没有问题,但是其他的,比如isspace
,使用无符号char
值。@EricPostischil:no.isspace takeint
。通常,单个字符作为int
传递,以与旧的C.Yeah兼容。通常,您可以使用标准字符串函数,而不考虑字符的符号(POSIX系统和许多其他系统,其中字符是单字节)。但这只有在使用不检查字符语义的函数时才有效(例如,用于排序、检查字母数字字符等)。@GiacomoCatenazzi:正如我所写的,isspace
,而其他
函数则采用无符号字符
值。参数的类型当然是int
,但根据C 2018 7.4 1,参数中的值应为非负或EOF
:在所有情况下,参数都是int
,其值应表示为无符号字符
,或应等于宏EOF
的值。如果参数有任何其他值,则行为未定义如果您有一个char
的数组x
,并且char
被签名,则传递x[i]
toisspace
可以传递一个负值,但行为没有定义。@GiacomoCatenazzi:在另一个方向上也存在问题。例如,fgetc
返回一个转换为int
的无符号字符。如果该值被分配给char
,它将被转换。如果char
是有符号的,unsigned char
值在char
中不可表示,行为不可移植C标准表示转换结果已实现定义或引发实现定义的信号。出于您的目的,如果编译器对char使用有符号或无符号值,您可以检查编译器。检查所有compi大多数编译器都有一个标志来更改字符的“signess”。