UTF-8编码的字符大于UTF-8的上限范围

时间:2013-05-16 08:45:02

标签: utf-8

我正在研究将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)这与“高代理人”的“低代理”一词有何关联?

非常感谢,即使这是一个荒谬的问题:)

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};
启动例如第三个成员 - 作为休耕:

  1. 将成员称为'ñ',系统将其理解为签名字符(1byte)。

  2. 'ñ'的值为(-15)为signed char,这等于241为unsigned char!

  3. 所以(-15)的值是通过启动作为字符串元素给出的。

  4. (-15)的值通常转换为signed intager为0(dec) - 15(dec)= 0xFFFFFFF1(hex)

  5. 解决方案就在这里,发现的是:

    int charToAnalyseStr[50]= {(unsigned char)'a', 0x7FFFFFFF, (unsigned char)'ñ', 1};
    

    所以charToAnalyseStr [2]在memort窗口中的应用为0x000000F1:)

    感谢您的大脑风暴!