1. 程式人生 > >gdb除錯,顯示utf-8字元

gdb除錯,顯示utf-8字元

gdb本身只支援ASCII, ISO-8859-1,set charset可以檢視。直接print utf8的中文字元會出現亂碼,
看到網上有個解決方法是在除錯程式中加入一個列印的函式,感覺比較好用,分享
一下。

將如下程式碼和main函式放在一起,除錯的時候 call pstring(s)就行。

void pstring(string& s)
{
  for (int i = 0; i < s.length(); i ++){
    int len = 0;
    if(s[i] < 0) {// multi-bytes utf-8 stream
      unsigned char
h = static_cast<unsigned char>(s[i]); if(h >> 4 == 0x0E) len = 3; // 1110XXXX 10XXXXXX 10XXXXXX if(h >> 5 == 0x06) len = 2; // 110XXXXX 10XXXXXX if(h >> 3 == 0x1E) len = 4; // 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX if(h >> 2 == 0x3E) len = 5; // 111110xx 10XXXXXX 10XXXXXX 10XXXXXX10XXXXXX
if(h >> 1 == 0x7E) len = 6; // 1111110x 10XXXXXX 10XXXXXX 10XXXXXX10XXXXXX 10XXXXXX } else if (s[i] == 0) return; else len = 1; // ascii, 0XXXXXXX string tmp = s.substr(i,len); tmp += "/0"; cout<<tmp; } cout<<'/n'; fflush(stdout); }
void pstring(char
* str) { string s=str; for (int i = 0; i < s.length(); i ++){ int len = 0; if(s[i] < 0) {// multi-bytes utf-8 stream unsigned char h = static_cast<unsigned char>(s[i]); if(h >> 4 == 0x0E) len = 3; // 1110XXXX 10XXXXXX 10XXXXXX if(h >> 5 == 0x06) len = 2; // 110XXXXX 10XXXXXX if(h >> 3 == 0x1E) len = 4; // 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX if(h >> 2 == 0x3E) len = 5; // 111110xx 10XXXXXX 10XXXXXX 10XXXXXX10XXXXXX if(h >> 1 == 0x7E) len = 6; // 1111110x 10XXXXXX 10XXXXXX 10XXXXXX10XXXXXX 10XXXXXX } else if (s[i] == 0) return; else len = 1; // ascii, 0XXXXXXX string tmp = s.substr(i,len); tmp += "/0"; cout<<tmp; } cout<<'/n'; fflush(stdout); }