2016-05-17 378 views
-1

,经过一段时间看上去UTF8转换字符串十六进制字符串,并且向后 我发现了一些例子和可能的解决方案,但只有无特殊字符的所有工作。 我有如下因素:在= “áéíóúñü”C++转换UTF8字符串为十六进制,反之亦然

结果768,16是:

“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

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

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

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

A-> “E1” 这个正确的未启用

E-> “E9” 这个正确的未启用

+0

您好,欢迎来SO!请阅读[this](http://stackoverflow.com/help/how-to-ask)文章,了解如何提出更好的问题,这将有助于人们给你更好的答案。特别是,添加你已经尝试过的代码。 –

回答

0

遍历在std::string对象中的每个 “字”,输出它的两位数十六进制等效为int

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

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

要打印数量为十六进制,了解the base I/O manipulators

要转换为了解static_castint

哦,我推荐使用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(); 
} 
+0

我试了一下,但结果是一样的,特殊字符是错误的。我使用ss << std :: setw(2)<< static_cast (static_cast (in [i]));对于每个角色 – Maialen

+0

@Maialen这是如何工作的?你有什么问题?什么“特殊字符”失败了?它是如何失败的?你得到了什么结果,你期望什么?我已经用我之前提到的一些代码更新了我的答案。 –

+0

结果是一样的。 – Maialen

相关问题