utf8编码算法与utf16算法
UTF 8 encoding Algorithm vs UTF 16 Algorithm
我试图将unicode字符的十进制值转换为使用c++的实际字符,我不想使用任何库。StackOverflow上的一个用户好心地给了我下面的函数,它将十进制表示转换为UTF 8字符。
当我在OSX上测试我的代码时,这解决了我所有的问题,但遗憾的是,当我在Windows上测试它时,输出的字符完全错误。我现在明白Windows使用UTF 16,这可以解释为什么错误的字符在Windows上输出。
问题是,因为我没有自己写的函数,我不知道它是如何工作的。我试过谷歌搜索函数的每个不同部分,我知道它是UTF 8编码算法,我知道它使用按位操作,但我不知道它是如何工作的。下面是函数:
void GetUnicodeChar(unsigned int code, char chars[5]) {
if (code <= 0x7F) {
chars[0] = (code & 0x7F); chars[1] = ' ';
} else if (code <= 0x7FF) {
// one continuation byte
chars[1] = 0x80 | (code & 0x3F); code = (code >> 6);
chars[0] = 0xC0 | (code & 0x1F); chars[2] = ' ';
} 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] = ' ';
} 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] = ' ';
} else {
// unicode replacement character
chars[2] = 0xEF; chars[1] = 0xBF; chars[0] = 0xBD;
chars[3] = ' ';
}
}
所以这是我的问题,有人知道如何将UTF 8编码函数转换为UTF 16吗?我对这两种算法都做了一些研究,事实上,我也不是很理解。
或者,我见过人们使用函数MultiByteToWideChar
,但我也不能让它工作。有没有人能给我提供一个方法或一个函数,让我在Windows上显示正确的unicode字符,而不需要用户改变他们的控制台代码页?
阅读维基百科上对UTF-8和UTF-16的描述,它们描述了编码算法。
试试这样写:
void GetUnicodeCharAsUtf8(unsigned int code, char chars[5])
{
if (code <= 0x7F) {
chars[0] = (code & 0x7F);
chars[1] = ' ';
} else if (code > 0x10FFFF) {
// unicode replacement character
chars[0] = 0xEF;
chars[1] = 0xBF;
chars[2] = 0xBD;
chars[3] = ' ';
} 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] = ' ';
}
}
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);
}
}
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- utf8编码算法与utf16算法