首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UTF 8编码算法与UTF 16算法

UTF 8编码算法与UTF 16算法
EN

Stack Overflow用户
提问于 2014-05-07 02:23:47
回答 1查看 3.6K关注 0票数 2

我正在尝试使用C++将unicode字符的十进制值转换为它们的实际字符,并且我不想使用任何库。StackOverflow上的一个用户很友好地给了我下面的函数,它可以将十进制表示转换为UTF8字符。

这解决了我在OSX上测试代码时的所有问题,但不幸的是,当我在Windows上测试它时,字符输出完全不正确。我现在知道Windows使用UTF 16,这就解释了为什么在Windows上会输出错误的字符。

问题是,由于函数不是我自己写的,所以我不知道它是如何工作的。我试着用谷歌搜索函数的每个不同部分,我知道它是UTF 8编码算法,我知道它使用的是按位操作,但我不知道它是如何工作的。下面是函数:

代码语言:javascript
复制
void GetUnicodeChar(unsigned int code, char chars[5]) {
if (code <= 0x7F) {
    chars[0] = (code & 0x7F); chars[1] = '\0';
} else if (code <= 0x7FF) {
    // one continuation byte
    chars[1] = 0x80 | (code & 0x3F); code = (code >> 6);
    chars[0] = 0xC0 | (code & 0x1F); chars[2] = '\0';
} else if (code <= 0xFFFF) {
    // two continuation bytes
    chars[2] = 0x80 | (code & 0x3F); code = (code >> 6);
    chars[1] = 0x80 | (code & 0x3F); code = (code >> 6);
    chars[0] = 0xE0 | (code & 0xF); chars[3] = '\0';
} else if (code <= 0x10FFFF) {
    // three continuation bytes
    chars[3] = 0x80 | (code & 0x3F); code = (code >> 6);
    chars[2] = 0x80 | (code & 0x3F); code = (code >> 6);
    chars[1] = 0x80 | (code & 0x3F); code = (code >> 6);
    chars[0] = 0xF0 | (code & 0x7); chars[4] = '\0';
} else {
    // unicode replacement character
    chars[2] = 0xEF; chars[1] = 0xBF; chars[0] = 0xBD;
    chars[3] = '\0';
}
}

所以我的问题是,有没有人知道如何将UTF 8编码函数转换为UTF 16编码函数?我对这两种算法都做了一些研究,事实是,我也不是很理解。

或者,我见过人们使用函数MultiByteToWideChar,但我也不能让它工作。有没有人能给我提供一个方法或函数,让我在Windows上显示正确的unicode字符,而不需要用户更改他们的控制台代码页?

EN

回答 1

Stack Overflow用户

发布于 2014-05-07 02:53:30

在维基百科上阅读UTF-8UTF-16的描述,它们描述了编码算法。

尝试如下所示:

代码语言:javascript
复制
void GetUnicodeCharAsUtf8(unsigned int code, char chars[5])
{
    if (code <= 0x7F) {
        chars[0] = (code & 0x7F);
        chars[1] = '\0';
    } else if (code > 0x10FFFF) {
        // unicode replacement character
        chars[0] = 0xEF;
        chars[1] = 0xBF;
        chars[2] = 0xBD;
        chars[3] = '\0';
    } else {
        int count;
        if (code <= 0x7FF) {
            // one continuation byte
            count = 1;
        } else if (code <= 0xFFFF) {
            // two continuation bytes
            count = 2;
        } else {
            // three continuation bytes
            count = 3;
        }
        for (int i = 0; i < count; ++i) {
            chars[count-i] = 0x80 | (code & 0x3F);
            code >>= 6;
        }
        chars[0] = (0x1E << (6-count)) | (code & (0x3F >> count));
        chars[1+count] = '\0';
    }
}

void GetUnicodeCharAsUtf16(unsigned int code, unsigned short chars[2])
{
    if ( ((code >= 0x0000) && (code <= 0xD7FF)) ||
        ((code >= 0xE000) && (code <= 0xFFFF)) )
    {
        chars[0] = 0x0000;
        chars[1] = (unsigned short) code;
    }
    else if ((code >= 0xD800) && (code <= 0xDFFF))
    {
        // unicode replacement character
        chars[0] = 0x0000;
        chars[1] = 0xFFFD;
    }
    else
    {
        // surrogate pair
        code -= 0x010000;
        chars[0] = 0xD800 + (unsigned short)((code >> 10) & 0x3FF);
        chars[1] = 0xDC00 + (unsigned short)(code & 0x3FF);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23502153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档