Формат CString с Unicode возвращает неправильный символ - PullRequest
1 голос
/ 12 июля 2011

Я пытаюсь отформатировать CString, используя следующий код:

const wchar_t * wch = L"μ";
CString str;
str.Format(_T("%c"), wch[0]);

Однако вместо того, чтобы str имел значение «μ», он фактически установлен на «¼».Когда я отлаживаю его, он распознает wch как "μ".

Далее, если я сделаю:

const wchar_t * wch = L"μ";
CString str;
str.Format(_T("%s"), wch);

, он выдаст str со значением "¼".(Кажется, он не отображается, но после ¼ должен быть верхний индекс L).

Компилятор настроен на использование Юникода, как и в других случаях, когда в программе я могу вызывать _T () иправильно ли он оценивается, только не при форматировании CString.

Что я делаю не так?

* Edit: * Выполнение дополнительной отладки показывает, что arglist метода CString Formatполучает значение "Ü _"

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

Я считаю, что вам нужно использовать "длинный" спецификатор типа char или string - поэтому %lc для wchar_t и %ls или %S для строки.

1 голос
/ 12 июля 2011

Попробуйте

setlocale(LC_ALL, "");

перед вызовом Format. (Если вы не делаете ничего необычного, достаточно вызвать setlocale один раз в начале вашего приложения.)

0 голосов
/ 12 июля 2011

Я вижу Miu с %c и с %lc

// a1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <afx.h>

int _tmain(int argc, _TCHAR* argv[])
{
    const wchar_t * wch = L"μ";
    CString str;
    str.Format(_T("%c"), wch[0]);
    MessageBox( GetForegroundWindow(), str.GetBuffer(), L"MyChar", MB_OK + MB_ICONHAND );
    str.Format(_T("%s"), wch);
    MessageBox( GetForegroundWindow(), str.GetBuffer(), L"MyChar", MB_OK + MB_ICONHAND );
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...