C ++将UTF8字符串转换为十六进制,反之亦然

时间:2016-05-17 09:34:43

标签: c++ string utf-8

需要时间将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/

我会尽力解释,但我不会说英语。遗憾。

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

  

A-> “61”

     

E-> “65”

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

  

A-> “c3a1”这是正确的转换

     

E-> “c3a9”这是正确的转换

我试图转换我发现的所有方式,包括那些暗示我的方式。但每次你转换一个特殊字符给我一个2位数的答案,这是不正确的。

  

A-> “e1”这不正确

     

E-> “e9”这不正确

1 个答案:

答案 0 :(得分:0)

循环遍历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();
}