将多字节字符映射到其unicode点表示形式

问题描述

| 如何在C语言中将单个UTF-8字符映射到其unicode点? [例如,
È
将被映射到
00c8
]。     

解决方法

如果平台的
wchar_t
存储unicode(如果它是32位类型,则可能会存储unicode),并且您具有UTF-8语言环境,则可以调用from3ѭ(来自C90.1)。
mbstate_t state = {0};
wchar_t wch;
char s[] = \"\\303\\210\";
size_t n;
memset(&state,sizeof(state));
setlocale(LC_CTYPE,\"en_US.utf8\"); /*error checking omitted*/
n = mbrtowc(&wch,s,strlen(s),&state);
if (n <= (size_t)-2) printf(\"%lx\\n\",(unsigned long)wch);
为了获得更大的灵活性,您可以调用iconv界面。
char s[] = \"\\303\\210\";
iconv_t cd = iconv_open(\"UTF-8\",\"UCS-4\");
if (cd != -1) {
    char *inp = s;
    size_t ins = strlen(s);
    uint32_t c;
    uint32_t *outp = &c;
    size_t outs = 0;
    if (iconv(cd,&inp,&ins,&outp,&outs) + 1 >= 2) printf(\"%lx\\n\",c);
    iconv_close(cd);
}
    ,一些事情要看: libiconv ConvertUTF.h MultiByteToWideChar(在Windows下)     ,UTF-8到UCS-2转换器的合理快速实现。 BMP之外的代理和字符保留为练习。 该函数返回输入“ 6”字符串消耗的字节数。负值表示错误。 产生的unicode字符放在指向
p
的地址处。
int utf8_to_wchar(wchar_t *p,const char *s)
{
const unsigned char *us = (const unsigned char *)s;
   p[0] = 0;
   if(!*us)
     return 0;
    else 
      if(us[0] < 0x80) {
        p[0] = us[0];
        return 1;
      }
      else 
        if(((us[0] & 0xE0) == 0xC0) && (us[1] & 0xC0) == 0x80) {
          p[0] = ((us[0] & 0x1F) << 6) | (us[1] & 0x3F);
#ifdef DETECT_OVERLONG
          if(p[0] < 0x80) return -2;
#endif    
          return 2;
        }
        else 
          if(((us[0] & 0xF0) == 0xE0) && (us[1] & 0xC0) == 0x80 && (us[2] & 0xC0) == 0x80) {
            p[0] = ((us[0] & 0x0F) << 12) | ((us[1] & 0x3F) << 6) | (us[2] & 0x3F);
#ifdef DETECT_OVERLONG
          if(p[0] < 0x800) return -2;
#endif    
            return 3;
          }
    return -1;
  }