如何在mfc应用程序

时间:2016-02-26 08:37:06

标签: c++ mfc

我将日语字符串转换为widechar但输出字符串像垃圾一样垃圾 我的代码片段 输入字符串

 CString strp ="C:\Users\Administrator\Desktop\新しいテキスト ドキュメント\オィデーオ.mp4"      

    LPCWSTR pchData1 = NULL;
    pchData1 = (LPCWSTR)strp.GetBuffer(strp.GetLength());
    TCHAR * japUni; 
    int lens = strp.GetLength();
    lens = lens*2;
    japUni= new TCHAR[lens+2];
    memset(japUni,0x00,(lens+2));
    LPCSTR pszNonUnicode;                                       
    USES_CONVERSION;
    pszNonUnicode = W2A( strp.LockBuffer( ) );
    strp.UnlockBuffer( );
    MultiByteToWideChar(CP_UTF8,0,pszNonUnicode,lens+2,japUni,lens+2);
    strp.Empty();
    strp = japUni;          
    if(japUni)
    {
        delete []japUni;
        japUni = NULL;
    }
  

输出字符串C:\ Users \ Administrator \ Desktop \?V ???????????????????????????????????????????????????????????? I.mp4

请在上面的代码中建议我做错了什么.....

2 个答案:

答案 0 :(得分:1)

嗯,你所显示的输入字符串是不可能的情况:

CString strp ="C:\Users\Administrator\Desktop\新しいテキスト ドキュメント\オィデーオ.mp4"

第一个明显的问题是你没有转义反斜杠,所以路径字符串格式不正确。

第二个更严重。这个编译的事实表明你正在编译一个多字节字符集(,非Unicode)。如果您正在编译Unicode,CString将被定义为CStringW,无法使用窄字符串文字进行初始化。因此CString实际上必须是CStringA

警钟正在响起。这就是你需要LPCWSTR演员表的原因。您告诉编译器假装一个窄字符串缓冲区实际上是一个宽字符串缓冲区。哎呀。尝试使用strp宏转换W2A(一个窄字符串)时出现同样的问题。它不是一个宽字符串,因此无法从转换为。当你在字符串类型之间进行转换时,尽量避免玩TCHAR游戏。最好是明确的。如果是宽字符串,请使用WCHAR;如果是窄字符串,请使用CHAR

无论如何,我猜你的输入字符串是在日语代码页932.如果是这种情况,你应该能够直接将它转换为宽字符串。我无法在我的系统上测试这个,我没有激活该代码页。

CStringA strJapanese = "C:\\Users\\Administrator\\Desktop\\新しいテキスト ドキュメント\\オィデーオ.mp4";
CStringW strUnicode;
const int cchBuffer = strJapanese.GetLength() * 2;  // reserve plenty of extra space
if (MultiByteToWideChar(932,
                        MB_PRECOMPOSED,
                        strJapanese,
                        strJapanese.GetLength(),
                        strUnicode.GetBufferSetLength(cchBuffer),
                        cchBuffer) == 0)
{
   const DWORD dwErrCode = GetLastError();
   // Failed; handle error.
   // ...
}
strUnicode.ReleaseBuffer(-1);

另一种可能性是您的字符串已经是UTF-8,在这种情况下,您将CP_UTF8作为第一个参数传递,0作为第二个参数传递。否则代码是相同的。

答案 1 :(得分:0)

虽然是日本的情况......

如果使用vs2003或更早版本,编译器的默认值为日语的mbcs(Shift-JIS(旧日语代码))。
如果使用vs2005或更高版本,则编译器的默认值为日语中的wbcs(Unicode)。 [/ D _UNICODE]

MBCS:UTF-8,S-Jis(Windows上的旧日语代码)
 WBCS:Unicode(UTF-16)

如果是前者:

CString szShiftJis = "blahblah esktop\新しいテキスト ドキュメント\オィデ・・・";
char bufUTF8[MAX_PATH];
char bufShiftJis[MAX_PATH];

WCHAR bufUnicode[MAX_PATH];

// (1)mbcs→Unicode
int iLenUnicode = MultiByteToWideChar(932, 0, szShiftJis, strlen(szShiftJis)+1, NULL, 0);
if (iLenUnicode <= sizeof(bufUnicode)/sizeof(bufUnicode[0]))
{
    MultiByteToWideChar(932, 0, szShiftJis, strlen(szShiftJis)+1, bufUnicode, MAX_PATH);

    // (2)Unicode→mbcs(UTF-8)
    int iLenUtf8 = WideCharToMultiByte(CP_UTF8, 0, bufUnicode, iLenUnicode, NULL, 0, NULL, NULL);
    if (iLenUtf8 <= sizeof(bufUTF8))
    {
        WideCharToMultiByte(CP_UTF8, 0, bufUnicode, iLenUnicode, bufUTF8, sizeof(bufUTF8), NULL, NULL);
    }
}

如果是后者:

(1)是不必要的。