我读到C没有定义char是有符号还是无符号,而在GCC页面中这表示它可以在x86上签名并且在PowerPPC和ARM中无符号.
Okey,我正在用GLIB编写一个程序,将char定义为gchar(不超过它,只是标准化的一种方式).
我的问题是,UTF-8怎么样?它使用的不仅仅是一块内存?
说我有一个变量
unsigned char*string ="我的字符串,带UTF8 enconding~>çã";
如果我将变量声明为,请参阅
无符号
我将只有127个值(因此我的程序将存储更多的mem块)或UTF-8也会变为负值?
对不起,如果我无法正确解释,但我认为我有点复杂.
注意:感谢所有答案
我不明白它是如何正常解释的.
我认为像ascii一样,如果我的程序中有一个有符号和无符号的字符,字符串有不同的值,它会导致混淆,想象它在utf8中.
我有几个要求解释我的评论.
char当您比较字符并期望某种顺序时,类型可以默认为有符号或无符号类型的事实可能很重要.特别是,UTF8使用高位(假设char是8位类型,在绝大多数平台中都是如此)来指示字符代码点需要表示多个字节.
一个快速而又肮脏的问题示例:
#include <stdio.h>
int main( void)
{
signed char flag = 0xf0;
unsigned char uflag = 0xf0;
if (flag < (signed char) 'z') {
printf( "flag is smaller than 'z'\n");
}
else {
printf( "flag is larger than 'z'\n");
}
if (uflag < (unsigned char) 'z') {
printf( "uflag is smaller than 'z'\n");
}
else {
printf( "uflag is larger than 'z'\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我工作的大多数项目中,char通常避免使用unadorned 类型,而使用明确指定的typedef unsigned char.有点像uint8_t来自stdint.h或
typedef unsigned char u8;
Run Code Online (Sandbox Code Playgroud)
通常处理unsigned char类型似乎运行良好并且几乎没有问题 - 我偶然遇到的一个问题是使用那种类型的东西来控制循环:
while (uchar_var-- >= 0) {
// infinite loop...
}
Run Code Online (Sandbox Code Playgroud)
两件事情:
char 类型是有符号还是无符号不会影响您将 UTF8 编码字符串与您使用的任何显示字符串类型(WCHAR 或诸如此类)相互转换的能力。不用担心,换句话说:UTF8 字节只是字节,无论您用作编码器/解码器,都会做正确的事情。
您的一些困惑可能是您正在尝试这样做:
unsigned char *string = "This is a UTF8 string";
Run Code Online (Sandbox Code Playgroud)
不要这样做 - 你正在混合不同的概念。UTF-8 编码的字符串只是一个字节序列。C 字符串文字(如上)并不是真正设计用来表示这一点的;它们旨在表示“ASCII 编码”的字符串。尽管在某些情况下(例如我这里的情况),它们最终是相同的,但在问题中的示例中,它们可能不是。当然在其他情况下他们不会。从外部资源加载您的 Unicode 字符串。一般来说,我会警惕在 .c 源文件中嵌入非 ASCII 字符;即使编译器知道如何处理它们,工具链中的其他软件也可能不知道。
使用unsigned char有其优点和缺点.最大的好处是你没有得到符号扩展或其他有趣的功能,如签名溢出,这会产生意外的计算结果.Unsigned char也与<cctype>宏/函数(如isalpha(ch))兼容(所有这些都需要unsigned char范围内的值).另一方面,所有I/O函数都需要char*,只要您执行I/O操作就需要进行转换.
至于UTF-8,将它存储在有符号或无符号数组中是可以的,但你必须小心那些字符串文字,因为几乎不能保证它们是有效的UTF-8.C++ 0x添加了UTF-8字符串文字以避免可能出现的问题,我希望下一个C标准也可以采用这些文字.
一般来说,只要您确保源代码文件始终是UTF-8编码,您应该没问题.
事实并非如此,unsigned/signed并没有指定变量可以保存多少个值。它指定了如何解释它们。
因此, anunsigned char与 a 具有相同数量的值signed char,只是一个有负数而另一个没有。它仍然是 8 位(如果我们假设 achar包含 8 位,我不确定它在任何地方都是如此)。
| 归档时间: |
|
| 查看次数: |
5754 次 |
| 最近记录: |