Отображение многобайтовых символов в их представление точки в юникоде - PullRequest
4 голосов
/ 24 мая 2011

Как вы сопоставляете один символ UTF-8 с его точкой Unicode в C? [Например, È будет сопоставлен с 00c8].

Ответы [ 3 ]

4 голосов
/ 24 мая 2011

Если на вашей платформе wchar_t хранится юникод (если это 32-битный тип, вероятно, он есть) и у вас есть локаль UTF-8, вы можете позвонить mbrtowc (из C90.1).1004 *

Для большей гибкости вы можете вызвать интерфейс 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);
}
2 голосов
/ 24 мая 2011

На что посмотреть:

  • libiconv
  • ConvertUTF.h
  • MultiByteToWideChar (под окнами)
0 голосов
/ 24 мая 2011

Достаточно быстрая реализация конвертера UTF-8 в UCS-2. Суррогат и персонажи вне БМП оставлены в качестве упражнения. Функция возвращает количество байтов, использованных из входной строки s. Отрицательное значение представляет ошибку. Результирующий символ 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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...