【问题标题】:C++ convert UTF8 string to hexadecimal and vice versaC++ 将 UTF8 字符串转换为十六进制,反之亦然
【发布时间】:2016-05-17 09:34:42
【问题描述】:

看 utf8 将字符串转换为十六进制字符串需要时间,然后向后 我找到了一些示例和可能的解决方案,但只有在没有特殊字符的情况下才能正常工作。 我有以下内容:

string in="áéíóúñü"

结果应该是:

“c3a1c3a9c3adc3b3c3bac3b1c3bc”

我尝试关注帖子和其他帖子:

C++ convert string to hexadecimal and vice versa

How to convert a string in hexadecimal string?

http://www.cplusplus.com/forum/beginner/161703/


我会尽量解释得更好,但我不会说英语。对不起。

我必须使用套接字发送一些数据。为此,我必须使用 UTF-8 将名称转换为十六进制,但在某些情况下会有特殊字符,例如 á、é、í... 转换普通字母时,每个字母的字符串长度为 2。

a-> "61"

e-> "65"

但特殊字符被编码(在 UTF-8 上)长度为 4

á-> "c3a1" 这是正确的转换

é-> "c3a9" 这是正确的转换

我已经尝试了所有我找到的方法的转换,包括建议我失败的方法。但是每次你转换一个特殊字符给我一个2位数的答案,这是不正确的。

á-> "e1" 这不正确

é-> "e9" 这不正确

【问题讨论】:

  • 您好,欢迎来到 SO!请阅读this 帖子了解如何提出更好的问题,这将有助于人们为您提供更好的答案。特别是,添加您已经尝试过的代码。

标签: c++ string utf-8


【解决方案1】:

遍历std::string 对象中的每个“字符”,将其与int 等效的两位十六进制输出。

对于循环,我建议您查看range-based for loops

要设置要打印的位数,请阅读setting stream precision

要将数字打印为十六进制,请阅读the base I/O manipulators

要转换为int,请阅读static_cast

哦,我建议对单个“字符”使用 unsigned char


基于上述的简单解决方案:

std::string stoh(std::string const& in)
{
    std::ostringstream os;

    for(unsigned char const& c : in)
    {
        os << std::hex << std::setprecision(2) << std::setw(2)
           << std::setfill('0') << static_cast<int>(c);
    }

    return os.str();
}

【讨论】:

  • 我试过了,结果还是一样,特殊字符是错误的。我使用 ss (static_cast(in[i]));每个字符
  • @Maialen 那是怎么工作的?你有什么问题?它在什么“特殊字符”上失败了?它是如何失败的?你得到了什么结果,你期望什么?我已经使用我之前提到的一些代码更新了我的答案。
  • 结果是一样的。
  • @Maialen 也许你的标准语言环境已经为你得到“错误”输出的字符扩展了 ASCII 编码?使用这些字符创建一个简单的文本文件,然后在十六进制编辑器中查看它。也许最好使用特定的库来处理 UTF-8,例如 utfcpplibiconv
  • @Maialen 还有it works fine for me。因此,您的编码确实不是您认为的那样,或者您的区域设置导致了问题,这似乎确实是一个问题。
猜你喜欢
  • 2011-03-23
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2021-07-17
  • 2010-09-23
  • 2010-09-17
相关资源
最近更新 更多