2011-07-11 32 views
1

我嘗試使用下面的代碼格式化一個CString:使用Unicode CString的格式返回錯誤的字符

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

然而,除了海峽具有「μ」的值,它實際上被設置爲「¼」 。當我調試它時,它識別wch爲「μ」。

而且,如果我做的:

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

它給人以價值STR 「¼」。 (它似乎沒有出現,但在¼後應該有一個上標L.)

編譯器被設置爲使用unicode,因爲在程序中我可以調用_T()並且擁有它正確評估,而不是格式化CString時。

我在做什麼錯?

* 編輯:*做更多的調試表明CString的Format方法的arglist中收到的「U_」

+3

有沒有可能你誤解了你所看到的? UNICODE字符'μ'是0x03BC。解釋爲兩個單字節字符,你得到'¼'是0xBC和上標L是0x03。 –

+0

你用UNICODE和_UNICODE編譯你的應用程序嗎?您的源文件是保存爲ANSI還是UTF-8?你有沒有嘗試明確使用CStringW? –

回答

3

值我相信你需要使用「長」字符或字符串格式說明 - 所以%lcwchar_t%ls%S爲字符串。

+0

似乎沒有幫助。使用'%lc'給了我一個空字符串,'%ls'或'%S'引發錯誤 – jonbooz

+1

@jonbooz:他的建議是正確的,對於VC++ 2010來說我的工作很好。您可能需要發佈更多的代碼... – ildjarn

0

我看到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; 
} 
1

調用格式之前嘗試

setlocale(LC_ALL, ""); 

。 (除非你做什麼不尋常的事情,在你的應用程序開始時就足夠讓你調用setlocale了。)

相關問題