C++ string

C++ string best practices => LPTSTR, PSTR, CString, _T, TEXT, Win32 API, Win16. string, wstring.

strings

http://msdn.microsoft.com/en-us/library/ms174288.aspx

LPTSTR

http://baike.baidu.com/view/3186101.htm 

Using CString       very  useful

http://msdn.microsoft.com/en-us/library/ms174288.aspx

CryptStringToBinary <=> CryptBinaryToString

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

#include "stdafx.h"

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <string>
#include <wincrypt.h>
#include <iostream>     // std::cout, std::end



#pragma comment(lib, "crypt32.lib")



int _tmain(int argc, _TCHAR* argv[])
{

    // Chinese characters for "zhongwen" ("Chinese language").
    const BYTE kChineseSampleText[] = { -28, -72, -83, -26, -106, -121, 0 };
    //-28 => 1110,0100 => 228
    //-72 => 1011,1000 => 184
    //-83 => 1010,1101 => 173
    //-26 => 1110,0110 => 230
    //-106 => 1001,0110 => 150
    //-121 => 1000,0111 => 135

    //const char kChineseSampleText[] = "xe4xb8xadxe6x96x87";
    //const char kChineseSampleText[] = "e48ade69687";

    DWORD strLen = 0;
    CryptBinaryToString(kChineseSampleText, 6,
        CRYPT_STRING_HEXRAW,
        NULL,
        &strLen
        );

    LPTSTR string1 = new TCHAR[strLen + 1];


    CryptBinaryToString(kChineseSampleText, 6,
        CRYPT_STRING_HEXRAW,
        string1,
        &strLen
        );

    string1[strLen] = '';
    LPCTSTR stringC = string1;

    //string strii = 

    wprintf(string1, "%s");


    //string to bytes

    DWORD strCLen = 0;

    CryptStringToBinary(
        stringC,
        strLen,
        CRYPT_STRING_HEXRAW,
        NULL,
        &strCLen,
        0,
        0
        );


    BYTE* cwStr = new BYTE[strCLen + 1];

    CryptStringToBinary(
        stringC,
        strLen,
        CRYPT_STRING_HEXRAW,
        cwStr,
        &strCLen,
        0,
        0
        );

    for (int i = 0; i < 6; i++)
    {
        BYTE x = cwStr[i];
        x++;
    }

    return 0;
}
View Code

 Wstring -> bytes -> base64 -> bytes -> Wstring Example

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

#include "stdafx.h"

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <string>
#include <wincrypt.h>
#include <iostream>     // std::cout, std::end



#pragma comment(lib, "crypt32.lib")

void WstringToBytes(LPWSTR wszString, char* szAnsi, DWORD* bytesSize)
{
    *bytesSize = WideCharToMultiByte(CP_UTF8, NULL, wszString, -1, NULL, 0, NULL, FALSE);

    WideCharToMultiByte(CP_UTF8, NULL, wszString, -1, szAnsi, *bytesSize, NULL, FALSE);
}

void BytesToWstring(char* bytes, LPWSTR wszString)
{
    DWORD dwNum = MultiByteToWideChar(CP_UTF8, 0, bytes, -1, NULL, 0);

    MultiByteToWideChar(CP_UTF8, 0, bytes, -1, wszString, dwNum);

    //×îºó¼ÓÉÏ''
    wszString[dwNum] = '';
}

int _tmain(int argc, _TCHAR* argv[])
{

    // Chinese characters for "zhongwen" ("Chinese language").
    //const BYTE kChineseSampleText[] = { -28, -72, -83, -26, -106, -121, 0 };
    //-28 => 1110,0100 => 228
    //-72 => 1011,1000 => 184
    //-83 => 1010,1101 => 173
    //-26 => 1110,0110 => 230
    //-106 => 1001,0110 => 150
    //-121 => 1000,0111 => 135

    //const char kChineseSampleText[] = "xe4xb8xadxe6x96x87";
    //const char kChineseSampleText[] = "e48ade69687";

    LPWSTR plainText = L"abcd1234";
    DWORD bytesLen = 6;
    char* buffer = new char[100];


    WstringToBytes(plainText, buffer, &bytesLen);

    BYTE* kChineseSampleText = new BYTE[bytesLen + 1];
    memcpy(kChineseSampleText, buffer, bytesLen);


    DWORD strLen = 0;
    CryptBinaryToString(kChineseSampleText, bytesLen,
        CRYPT_STRING_BASE64, //CRYPT_STRING_HEXRAW, CRYPT_STRING_BASE64
        NULL,
        &strLen
        );

    LPTSTR string1 = new TCHAR[strLen + 1];


    CryptBinaryToString(kChineseSampleText, bytesLen,
        CRYPT_STRING_BASE64, //CRYPT_STRING_HEXRAW, CRYPT_STRING_BASE64
        string1,
        &strLen
        );

    string1[strLen] = '';
    LPCTSTR stringC = string1;

    //string strii = 

    wprintf(string1, "%s");


    //string to bytes

    DWORD strCLen = 0;

    CryptStringToBinary(
        stringC,
        strLen,
        CRYPT_STRING_BASE64,
        NULL,
        &strCLen,
        0,
        0
        );


    BYTE* cwStr = new BYTE[strCLen + 1];

    CryptStringToBinary(
        stringC,
        strLen,
        CRYPT_STRING_BASE64, //CRYPT_STRING_HEXRAW, CRYPT_STRING_BASE64
        cwStr,
        &strCLen,
        0,
        0
        );

    cwStr[strCLen] = '';
    /*for (int i = 0; i < 6; i++)
    {
        BYTE x = cwStr[i];
        x++;
    }*/

    LPWSTR result = (LPWSTR)malloc(1000);
    BytesToWstring((char*)cwStr, result);


    return 0;
}
View Code

Example

UTF16 to UTF8 to UTF16 simple CString based conversion

http://www.codeproject.com/Articles/26134/UTF-to-UTF-to-UTF-simple-CString-based-conver

wstring => char*

char* = > wstring

int _tmain(int argc, _TCHAR* argv[])
{
    /*char sText[20] = { "多字节字符串!OK!" };  //bug; it is bytes

    DWORD dwNum = MultiByteToWideChar(CP_UTF8, 0, sText, -1, NULL, 0);

    wchar_t* pwText;
    pwText = new wchar_t[dwNum];

    MultiByteToWideChar(CP_UTF8, 0, sText, -1, pwText, dwNum);*/

    wchar_t wText[20] = { L"宽字符转换实例!OK!" };

    DWORD dwNum2 = WideCharToMultiByte(CP_UTF8, NULL, wText, -1, NULL, 0, NULL, FALSE);
    char* psText;
    psText = new char[dwNum2];

    WideCharToMultiByte(CP_UTF8, NULL, wText, -1, psText, dwNum2, NULL, FALSE);


    DWORD dwNum = MultiByteToWideChar(CP_UTF8, 0, psText, -1, NULL, 0);

    wchar_t* pwText;
    pwText = new wchar_t[dwNum];

    MultiByteToWideChar(CP_UTF8, 0, psText, -1, pwText, dwNum);





    return 0;
}
View Code

CString is an ATL/MFC class (actually, a specialization of the CStringT class template). Because ATL and MFC are Windows specific, the class is also inherently Windows specific. ATL and MFC are not included with VC++ Express, so if you don't have VC++ Professional or better, using this isn't an option for you.

If you want a string class that is platform agnostic, use std::string or std::wstring (which are specializations of the std::basic_string class template) instead, as these are part of the C++ standard library.

  http://social.msdn.microsoft.com/Forums/zh-CN/660029ba-994a-4f85-871b-2e5ae7b9c95b/cstring-help-in-regular-c?forum=vcgeneral

But, if you are going to write Win32 C++ code, I think CString's interface is more convenient (...but maybe someone would say it is more "bloated" ;)

For example: with CString you have methods to load strings from the resources.

Moreover, CString offers a convenient FormatMessage method, which is good for internationalization, see the so called problem of "Yoda speak" on Mihai Nita's blog post here:

http://mihai-nita.net/2006/04/15/string-api-and-internationalization/

And CString assumes that strings are NUL-terminated (which is good for interoperability with Win32 functions like say GetWindowText), instead std::[w]string doesn't.

And CString offers an implicit conversion operator LPCTSTR, so you can simply pass CString's to Win32 APIs having LPCTSTR parameters.

Moreover, if you are using a pre-VC10 compiler which does not support move semantics, I think storing CString in STL containers and passing them around is faster than std::[w]string, because CString uses COW (Copy-On-Write) technique, so it avoids useless copies (e.g. when a vector is resized because its capacity is insufficient). (However, I think this problem is solved in VC10 thanks to move semantics applied to std::[w]string.)

    

C++:在非MFC程序中如何引用CString?

http://blog.csdn.net/xiashengfu/article/details/7911086

原文地址:https://www.cnblogs.com/kevinygq/p/3980064.html