[英]C++ convert UTF8 string to hexadecimal and vice versa
utf8將字符串轉換為十六進制字符串需要花費一些時間,向后看,我發現了一些示例和可能的解決方案,但是,只有在沒有特殊字符的情況下,所有示例都可以正常工作。 我有以下幾點:
字符串in =“áéíóúñü”
結果應該是:
“ c3a1c3a9c3adc3b3c3bac3b1c3bc”
我嘗試關注以下內容以及其他內容:
http://www.cplusplus.com/forum/beginner/161703/
我會盡力解釋得更好,但我的英語說得不好。 抱歉。
我必須使用套接字發送一些數據。 為此,我必須使用UTF-8將名稱轉換為十六進制,但在某些情況下具有特殊字符,例如á,é,í...。轉換普通字母時,每個字母的字符串長度為2。
a->“ 61”
e->“ 65”
但是(在UTF-8上)特殊字符的編碼長度為4
á->“ c3a1”這是正確的轉換
é->“ c3a9”,這是正確的轉換
我嘗試了所有找到的方法的轉換,包括那些使我失望的方法。 但是每次轉換一個特殊字符都會給我2位數字的答案,這是不正確的。
á->“ e1”這是不正確的
é->“ e9”這是不正確的
循環遍歷std::string
對象中的每個“字符”,將其兩位int
十六進制等效值輸出為int
。
對於循環,我建議您研究基於范圍的for循環 。
要設置要打印的位數,請閱讀有關設置流精度的信息 。
要將數字打印為十六進制,請閱讀有關基本I / O操作器的信息 。
要轉換為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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.