为什么 WinApi 让我将 wchar_t 作为 char 使用?

问题描述 投票:0回答:1

我正在阅读 C.Petzold 关于 Windows 编程的书,并试图了解 Windows 如何处理 unicode。

。例如,我发现 wcslen 的一些实现如下所示:

size_t wcslen(const wchar_t* start)
{
    const wchar_t* end = start;
    while (*end != L'\0')
        ++end;
    return end - start;
}

我想看看如果我将 wchar_t 视为 char 会发生什么,所以我写了这个函数:

size_t CDECL mywcslen(wchar_t * s)
{
  
  size_t len = 0 ; 

  while(s[len]){
    ++len ; 
  }
  
  return len ; 
  
}

,由于某种原因它工作得很好。例如,如果我们将字符串“Hello”转换为utf-16字节,我们将得到这个字节数组:

0048 0065 006c 006c 006f
,因此函数应该在遇到第一个
00
时中断,但事实并非如此。为什么?

c winapi
1个回答
0
投票

so 函数应该在遇到第一个 00 时中断,但事实并非如此。为什么

您在循环中一次读取两个字节。因此,您在第一次循环迭代中读取

0x0048
,在第二次循环迭代中读取
0x0065
,在第三次循环迭代中读取
0x006C
,等等。这些值都是非零,直到您的程序到达第六次循环迭代。因此,您的循环直到第六次循环迭代才会终止。

© www.soinside.com 2019 - 2024. All rights reserved.