C++ 将字符转换为UTF-8的逻辑

C++ 将字符转换为UTF-8的逻辑,c++,c,utf-8,character-encoding,mbcs,C++,C,Utf 8,Character Encoding,Mbcs,我有一段代码,代码中的注释表示它将大于7F的任何字符转换为UTF-8。关于此代码,我有以下问题: if((const unsigned char)c > 0x7F) { Buffer[0] = 0xC0 | ((unsigned char)c >> 6); Buffer[1] = 0x80 | ((unsigned char)c & 0x3F); return Buffer; } 这段代码是如何工作的 我正在使用的当前windows代码

我有一段代码,代码中的注释表示它将大于
7F
的任何字符转换为UTF-8。关于此代码,我有以下问题:

if((const unsigned char)c > 0x7F)
  {
    Buffer[0] = 0xC0 | ((unsigned char)c >> 6);
    Buffer[1] = 0x80 | ((unsigned char)c & 0x3F);
    return Buffer;
  }
  • 这段代码是如何工作的
  • 我正在使用的当前windows代码页是否对放置在
    缓冲区中的字符有任何影响

  • 首先,一般来说,代码不起作用。通过 巧合的是,如果
    char
    (或
    无符号)中的编码
    char
    )是ISO-8859-1,因为ISO-8859-1具有相同的代码 点作为前256个Unicode代码点。但是ISO-8859-1已经 大部分已被ISO-8859-15取代,因此可能不会 工作(例如,在0xA4中试用。欧元登录 ISO-8859-15。它将为您提供完全不同的 字符。)

    有两种正确的转换方法,它们都是 取决于知道所输入字节的编码(其中 意味着您可能需要多个版本的代码,具体取决于 关于编码)。最简单的方法是使用 256个字符串,每个字符一个,并索引到其中。在哪儿 在这种情况下,如果
    ,则不需要
    。另一个是翻译
    将代码转换为Unicode代码点(32位UTF-32),然后进行翻译
    将其转换为UTF-8(某些情况下可能需要两个以上的字节)
    字符:欧元字符为0x20AC:0xE2、0x82、0xAC)

    编辑:

    有关UTF-8的详细介绍: . 标题说明了这一点 是针对Unix/Linux的,但是系统非常少(如果有的话) 其中的具体信息(且此类信息明确
    标记)。

    1。信息技术按照UTF-8编码的定义工作?要不然怎么办?@R.MartinhoFernandes:我想是的……这段代码不是我写的。它已经工作了一段时间了。所以我想这是正确的。我想理解它背后的逻辑。“我想你需要挖掘UTF-8规格。”Asha没有太多的东西要理解,假设你知道什么是<代码> < <代码> > <代码> > >代码>操作员做(如果不是,在一些C++学习材料中应该很容易找到)。UTF-8规范说明了每个位需要去哪里,代码只是将所有位放在它们需要去的地方。@R.MartinhoFernandes,除非它没有。该代码假定单字节编码为拉丁-1,拉丁-15已在很大程度上取代了拉丁-1。(我也很好奇
    缓冲区
    ,他返回一个指向缓冲区的指针,并且缓冲区不是
    '\0'
    终止的。我对这段代码非常怀疑。)