0

我正在将 uft-8 编码代码从 C# 转换为 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)这与“高代理”的“低代理”一词有某种关系吗?

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

4

2 回答 2

1

听起来好像您正在读取带符号的字节(您的输入是否可能是 ISO 8859-1?):您的字节被解释为在 -128..127 而不是 0..255 范围内,而您的值应该是 0xf1 (241) 被读取为 -15,这是二进制补码中的 0xfffffff1。在 C 中,“char”通常是默认签名的[1];你应该使用“无符号字符”。

Unicode 没有达到 0xfffffff1,这就是为什么 UTF-8 不为此类代码点提供编码的原因。

[1] 准确地说,“char”不同于“signed char”和“unsigned char”。但它可以表现为无符号或有符号,你得到的是implementation-defined

于 2013-05-16T09:23:37.477 回答
0

我想解释这个问题,但 Joni 是第一个 :)

@Joni:你完全正确。

当我将整数字符串启动为:

int charToAnalyseStr[50]= {'a', 0x7FFFFFFF, 'ñ', 'ş', 1};

例如,这第三个成员的启动 - 以休闲方式发生:

  1. 将成员作为 'ñ' 被系统理解为有符号字符(1 字节)。

  2. 'ñ' 的值为 (-15) 作为有符号字符,这等于 241 作为无符号字符!

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

  4. (-15) 的值通常转换为有符号整数为 0(dec) - 15(dec) = 0xFFFFFFF1 (hex)

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

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

所以 charToAnalyseStr[2] 在内存窗口中显示为 0x000000F1 :)

感谢您的头脑风暴!

于 2013-05-16T12:04:26.600 回答