0

我有一个包含以下句子的文件:returnCodeMsgDE=Es gibt nicht genug Arbeitsspeicher um das Programm auszuf\u00FChren. Zurzeit gibt es %d frei MB zu verf\u00FCgung

我想阅读这些句子,将它们写入一个将传递给 MessageBox 的变量,这样我就可以将它们写入一个对话窗口,其中 unicode 符号应该被它们的 unicode 等效的本地字符替换。

但是我得到的对话框是这样的文本:“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 unicode 版本,但它们都不起作用。

我也尝试过设置语言环境。

你可以帮帮我吗?此刻我完全迷失了。

4

1 回答 1

1

您收到的字符串是L"auszuf\\u00FChren",用 C 源代码表示法编写,输出为“auszuf\u00FChren”。

您将需要一层额外的转义,以便将序列\u00FC转换为变音符号ü。以下示例为 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 函数,但我找不到它。

于 2013-11-11T15:02:16.870 回答