我正在研究将C#的uft-8编码代码翻译成C. UFT8涵盖从0x0000到0x7FFFFFFF(http://en.wikipedia.org/wiki/UTF-8)的字符值范围。
C#文件中的编码功能编码例如字符'ñ'没有问题。
当我在VS 2005的内存窗口中查看时,这个字符'ñ'在我的示例程序中的十六进制值为FFFFFFF1。 但是Windows-Symbol-table中的字符“ñ”的十六进制值为0xF1。
现在,在我的示例程序中,我验证字符串中的字符并找到最高范围的UTF-8,以确定应该使用哪个Utf8编码范围进行编码。
这样:
"charToAnalyse" is here a character of a string::
{
char utfMode = 0;
char utf8EncoderMode = 0;
if(charToAnalyse >= 0x0000 && charToAnalyse <= 0x007F)
{utfMode =1;}
else if(charToAnalyse >= 0x0080 && charToAnalyse <= 0x07FF)
{utfMode =2;}
else if(charToAnalyse >= 0x0800 && charToAnalyse <= 0xFFFF)
{utfMode =3;}
else if(charToAnalyse >= 0x10000 && charToAnalyse <= 0x1FFFFF)
{utfMode =4;}
else if(charToAnalyse >= 0x200000 && charToAnalyse <= 0x3FFFFFF)
{utfMode =5;}
else if(charToAnalyse >= 0x4000000 && charToAnalyse <= 0x7FFFFFFF)
{utfMode =6;}
...
...
...
if(utfMode > utf8EncoderMode)
{
utf8EncoderMode = utfMode;
}
在此函数中utfMode = 0表示字符'ñ',因为ñ== 0xFFFFFFF1,并且不能用上面的代码进行分类。
我的问题在这里: 1)ñ的值是否为0xFFFFFFF1是真的吗?如果'是',它如何将猫分类为UTF8编码?字符的值是否可能大于U + 7FFFFFFF(0x7FFFFFFF)? 2)这与“高代理人”的“低代理”一词有何关联?
非常感谢,即使这是一个荒谬的问题:)
答案 0 :(得分:1)
听起来好像你正在读取有符号的字节(你是ISO 8859-1中的输入吗?):你的字节被解释为在-128..127而不是0..255的范围内,并且你的值应该是0xf1(241),而不是读取为-15,这是二进制补码中的0xfffffff1。在C中,“char”通常默认签名[1];你应该使用“unsigned char”。
Unicode并不像0xfffffff1那么远,这就是UTF-8不为这些代码点提供编码的原因。
[1]确切地说,“char”与“signed char”和“unsigned char”都不同。但它可以表现为无符号或有符号,并且您得到的是implementation-defined。
答案 1 :(得分:0)
我想解释这个问题,但Joni是第一个:)
@Joni:你是对的。当我启动intager字符串时:
int charToAnalyseStr[50]= {'a', 0x7FFFFFFF, 'ñ', 'ş', 1};
启动例如第三个成员 - 作为休耕:
将成员称为'ñ',系统将其理解为签名字符(1byte)。
'ñ'的值为(-15)为signed char,这等于241为unsigned char!
所以(-15)的值是通过启动作为字符串元素给出的。
(-15)的值通常转换为signed intager为0(dec) - 15(dec)= 0xFFFFFFF1(hex)
解决方案就在这里,发现的是:
int charToAnalyseStr[50]= {(unsigned char)'a', 0x7FFFFFFF, (unsigned char)'ñ', 1};
所以charToAnalyseStr [2]在memort窗口中的应用为0x000000F1:)
感谢您的大脑风暴!