【问题标题】:C++ get unicode character by it's utf-8 valueC++ 通过它的 utf-8 值获取 unicode 字符
【发布时间】:2016-02-09 08:06:35
【问题描述】:

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

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

  • string+= static_cast(character_integer_value);
  • 字符串+= (char)character_integer_value;
  • string+= 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 来编译该代码。

【问题讨论】:

  • 作为旁注:如果您仍然要复制参数,为什么不为简单起见按值传递并允许调用者根据需要移动字符串?
  • 另外,我为你调试了你的程序。它只返回给定输入的一个字符,而不是 2 个,所以逻辑有问题。
  • 好的,我理解,& 意思是通过引用(或指针,我还没有真正理解差异)传递值。但是,请忽略我所有不相关的错误,我相信我有很多错误,比如没有清除内存等。在我的程序中,我只会使用这个功能一次。
  • 但是那个特定的字形只能用 utf-8 中的两个代码点来表示。因此,您的输出字符串中需要 2 个chars。
  • 你确定你的控制台使用的是 utf-8 吗?

标签: c++ unicode utf-8


【解决方案1】:

你完全错了。

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

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

【讨论】:

  • 是的,将 C4 和 93 转换为两个连续字符可能是正确的解决方案。我真的不明白 275 是从哪里来的?
  • ē 是 unicode 字符 U+0113,275 是 113 hex 的十进制值。所以ē是代码点275
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多