2013-11-11 3 views
0

У меня есть файл с предложениями, как это: returnCodeMsgDE=Es gibt nicht genug Arbeitsspeicher um das Programm auszuf\u00FChren. Zurzeit gibt es %d frei MB zu verf\u00FCgungпечати Юникода строки в C

Я хочу, чтобы прочитать эти предложения, записать их в переменную, которая будет передан MessageBox, так что я могу записать их в диалоговом окне , где символы юникода должны быть заменены их эквивалентными символами, эквивалентными юникоду.

Но диалоговые окна, которые я получаю, имеют следующий текст: «auszuf \ u00FChren».

Это часть моего кода, где такая ситуация случается:

_TCHAR* errorMsg = NULL; 

_TCHAR* returnCodeMsgDE2 = readPropertiesFile(_T_ECLIPSE("returnDE")); //here I get this string: L"returnCodeMsgDE=Es gibt nicht genug Arbeitsspeicher um das Programm auszuf\\u00FChren. Zurzeit gibt es %d frei MB zu verf\\u00FCgung" 

_stprintf(errorMsg, _T_ECLIPSE("%s"), returnCodeMsgDE2, _freeMemory()); //freememory() returns an Integer. 


MessageBox(topWindow, errorMsg, title, MB_OK); 

Я не знаю, как сделать свою программу правильно представляют символы Unicode, я пробовал много PRINTF и Scanf версии Юникода и никто из них не работает.

Я также попытался установить языковой стандарт.

Не могли бы вы мне помочь? В настоящий момент я полностью потерян.

+0

Вы пробовали функции, объявленные в wchar.h? – JIghtuse

+0

Сначала проверьте свой СТРОЙ-ТИП. TCHAR определяется как wchar_t в сборке Unicode, но как char в сборке без Unicode. Только wchar_t может корректно обрабатывать Unicode. – TerrenceSun

ответ

1

Строка, которую вы получаете, - L"auszuf\\u00FChren", написанная в исходной системе C, которая выдается как «auszuf \ u00FChren».

Вам понадобится дополнительный слой unescaping, так что последовательность \u00FC будет преобразована в umlaut ü. Follwoing пример реализует (очень грубый) механизм неэкранированного для синтаксиса C строки как для UNICODE и ASCII строит в C:

#include <windows.h> 

#ifdef UNICODE 
#define stprintf swprintf 
#else 
#define stprintf sprintf 
#endif 

static int hexdigit(TCHAR c) 
{ 
    if ('0' <= c && c <= '9') return c - '0'; 
    if ('a' <= c && c <= 'f') return c - 'a' + 10; 
    if ('A' <= c && c <= 'F') return c - 'A' + 10; 
    return -1; 
} 

static TCHAR hexcode(TCHAR const **p, int n) 
{ 
    TCHAR uc = 0; 

    while (n--) { 
     int d = hexdigit(*(*p)++); 

     if (d < 0) return 0xfffd; 
     uc = (uc << 4) + d; 
    } 
    return uc; 
} 

/* 
*  Resolve C escapes in src and write up to n - 1 characters 
*  to str, which is zero-terminated. Returns number of 
*  characters in str, not counting the trailing NUL. 
*/ 
int unescape(TCHAR *str, int n, const TCHAR *src) 
{ 
    TCHAR *p = str; 
    TCHAR *end = p + n - 1; 

    while (*src) { 
     if (p == end) break; 

     if (*src == '\\') { 
      src++; 

      switch (*src++) { 
      case 'n': *p++ = '\n'; break; 
      case 't': *p++ = '\t'; break; 
      case '\\': *p++ = '\\'; break; 
      case '\'': *p++ = '\''; break; 
      case '"': *p++ = '\"'; break; 
      case '0': *p++ = '\0'; break;    
      case 'x': *p++ = hexcode(&src, 2); break;       
      case 'u': *p++ = hexcode(&src, 4); break; 

      /* Ignore octal notation and non-printable chars */ 
      } 
     } else { 
      *p++ = *src++; 
     } 
    } 

    *p = '\0'; 
    return p - str; 
} 

#define MAXBUF 80 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    TCHAR *title_esc = TEXT("Speicherplatz ungen\\u00FCgend"); 
    TCHAR *fmt_esc = TEXT("Es stehen nur %d MB zur Verf\\u00FCgung!"); 
    TCHAR title[MAXBUF]; 
    TCHAR fmt[MAXBUF]; 
    TCHAR msg[MAXBUF]; 

    unescape(title, MAXBUF, title_esc); 
    unescape(fmt, MAXBUF, fmt_esc); 
    stprintf(msg, fmt, 17); 

    MessageBox(NULL, msg, title, MB_OK); 
    return 0; 
} 

Существует, вероятно, уже чист и лучше реализована функция API для этого, но я не мог Найди это.

+0

Он отлично работал. Vielen dank, Herr U + 00D6hm! – mochomecha

Смежные вопросы