C++通过 utf-8 值获取 unicode 字符

C++ get unicode character by it's utf-8 value

本文关键字:unicode 字符 获取 通过 utf-8 C++      更新时间:2023-10-16

我不擅长 C++我正在尝试创建函数以将 URL 编码字符串转换为常规字符串。

但是我得到了奇怪的结果,例如,%C4%93(十进制 50323)应该是 utf-8 符号 ē,但是当我在控制台中打印时,我得到了 ō。我试过了:

  • 字符串+= static_cast(character_integer_value);
  • 字符串+= (字符)character_integer_value;
  • 字符串+= character_integer_value;

但这些都没有给我预期的输出。

你能指出我做错了什么吗?

std::string myUrldecode(const std::string& original) {
    std::string s = original;
    std::string tmp0 = "";
    int tmp1 = 0;
    int tmp2 = 0;
    std::string decoded = "";
    for (string::size_type i = s.find("%");
        i != string::npos;
        i = s.find("%"))
    {
        if(i > 0){
            decoded+= tmp0;
            tmp0 = "";
            tmp2 = 0;
        }
        decoded+= s.substr(0, i);
        s.erase(0, i);
        tmp0+= s.substr(0, 2);
        tmp1 = strtol(s.substr(1, 2).c_str(), nullptr, 16);
        if(tmp1 >= 20 && tmp1 < 127){
            decoded+= static_cast<char>(tmp1);
            s.erase(0, 3);
            tmp0 = "";
        }
        else if(tmp1 >= 192 && tmp1 < 223){
            tmp2 = tmp1;
            s.erase(0, 3);
        }
        else if(tmp1 >= 128 && tmp1 <= 191 && tmp2 > 192){
            tmp1+= tmp2 * 256;
            decoded+= tmp1;
            s.erase(0, 3);
            tmp0 = "";
        }
        else{
            s.erase(0, 3);
        }
    }
    decoded+= tmp0;
    decoded+= s;
    return decoded;
}

我正在使用带有GCC 4.9.2 32位的Dev-C++ 5.11来编译该代码。

你完全错了。

"%C4%93"ē的UTF-8编码,因此您只需将数字(C4 + 93)转换为char s。 相反,您似乎担心字符范围 127-192 等。

我认为您编写的代码可能试图将 Unicode 代码点转换为 UTF-8(275 -> C493)。