C++ Builder string相互转换(转)

源:http://www.cnblogs.com/zhcncn/archive/2013/05/20/3089084.html

1. char*->string

(1)直接转换

const char* nodename;
string temp = nodename; string temp2(nodename);

2. wchar_t*->wstring

(1)直接转换

const wchar_t* nodename;
wstring temp = nodename; wstring temp2(nodename);

3. string->char*

   wstring->char*

方法一:

(1)将wstring.c_str()转为wchar_t*

方法二:

(1)将string.c_str(), wstring.c_str()转为AnsiString(http://blog.csdn.net/bannico/article/details/7577728),

(2)将AnsiString.c_str()转为char*

方法一:
string temp;
const char* nodename = temp.c_str();
方法二:
struct IPAddress{
    std::wstring hostname;
    std::vector<std::wstring> ips;
};

scripting::IPAddress dns = (*pPreloadDns)[i];
AnsiString strA = dns.hostname.c_str();
char * hn = strA.c_str();

但据说这样很不可靠(http://bbs.csdn.net/topics/30479944),安全的做法是:

方法三: String str="123456";
int len=str.Length();
char *cp=new char[len+1];
StrPCopy(cp, str);

4. wstring->wchar_t*

    string->w_char*(参见5)

方法一:

(1)将wstring.c_str()转为wchar_t*

方法二.一:

(1)将wstring.c_str()转为UnicodeString

(2)将UnicodeString.c_str()转为wchar_t*

方法二.二:

(1)将wstring.c_str()转为AnsiString

(2)使用ANSIToUnicode方法将AnsiString.c_str()转为wchar_t*

方法一:
wstring temp;
wchar_t* nodename = temp.c_str();
方法二.一:
struct IPAddress{
    std::wstring hostname;
    std::vector<std::wstring> ips;
};

scripting::IPAddress dns = (*pPreloadDns)[i];
UnicodeString strA = dns.hostname.c_str();
//char * hn = strA.c_str();
wchar_t * hn = strA.c_str();

方法二.二:
struct IPAddress{
    std::wstring hostname;
    std::vector<std::wstring> ips;
};

scripting::IPAddress dns = (*pPreloadDns)[i];
AnsiString strA = dns.hostname.c_str();
//char * hn = strA.c_str();
wchar_t * hn = ANSIToUnicode(strA.c_str());

5. char*->UnicodeString->wstring, wchar_t*

(1)将char*转为UnicodeString

(2)将UnicodeString.c_str()转为wstring, wchar_t*

UnicodeString temp(inet_ntoa(pAddr->sin_addr)) ; //inet_ntoa returns char* std::wstring addr(temp.c_str()); wchar_t* addr2 = temp.c_str(); log_debug(_T("set connection ip:") << addr); con->setIP(addr);

6. wchar_t*->AnsiString->string, char*

(1)将wchar_t*转为AnsiString

(2)将AnsiString.c_str()转为string, char*

wchar_t* str = wstring.c_str(); AnsiString temp(str ) ; //inet_ntoa returns char*
std::string addr(temp.c_str()); char* addr2 = temp.c_str(); log_debug(_T("set connection ip:") << addr); con->setIP(addr);

下面关于string,wstring互转的方法是错误的。对ansi字符可能能得到正确结果,但如果传入的参数是“中文”字符串,将得不到正确的结果。

 7. string->wstring

static wstring Str2Wstr (string str )
{
    if (str.length() == 0)
        return L"";

    std::wstring wstr;
    wstr.assign (str.begin(), str.end());
    return wstr;
}

8. wstring->string

static string Wstr2Str(wstring wstr )
{
    if (wstr.length() == 0)
        return "";

    std::string str;
    str.assign (wstr.begin(), wstr.end());
    return str;
}

正确的做法是使用MultiByteToWideChar和WideCharToMultiByte:

9. string->wstring

std::wstring stringToWstring(const std::string& str)
{
    LPCSTR pszSrc = str.c_str();
    int nLen = MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, NULL, 0);
    if (nLen == 0)
        return std::wstring(L"");

    wchar_t* pwszDst = new wchar_t[nLen];
    if (!pwszDst)
        return std::wstring(L"");

    MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, pwszDst, nLen);
    std::wstring wstr(pwszDst);
    delete[] pwszDst;
    pwszDst = NULL;

    return wstr;
}

10. wstring->string

std::string wstringToString(const std::wstring& wstr)
{
    LPCWSTR pwszSrc = wstr.c_str();
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
    if (nLen == 0)
        return std::string("");

    char* pszDst = new char[nLen];
    if (!pszDst)
        return std::string("");

    WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
    std::string str(pszDst);
    delete[] pszDst;
    pszDst = NULL;

    return str;
}

测试代码:

int _tmain(int argc, _TCHAR* argv[])
{
    std::string str = "中文";
    std::wstring wstr = L"中文";
    std::string str1 = "";
    std::wstring wstr1 = L"";
    LPCSTR pSrc = "中文";
    LPCWSTR pwzSrc = L"中文";

    stringToWstring(str);
    wstringToString(wstr);
    stringToWstring(str1);
    wstringToString(wstr1);
    stringToWstring(pSrc);
    wstringToString(pwzSrc);

    return 0;
}
时间: 2024-08-06 12:44:47

C++ Builder string相互转换(转)的相关文章

XE6 ShortString与String相互转换

program Test; {$APPTYPE CONSOLE} uses System, System.SysUtils; const Value: array[0..5] of Byte = (5, 72, 101, 76, 76, 111); { Old ShortString representation of 'Hello' } type EShortStringConvertError = class(Exception) end; function ShortStringToStr

实战c++中的string系列--std:vector&lt;char&gt; 和std:string相互转换(vector to stringstream)

有时候也会遇到std:vector与转std:string 相互转换的情况. 首先看一下vector<char>如何转string: std::vector<char> *data = response->getResponseData(); std::string res; //方法一 for (int i = 0;i<data->size();++i) { res+=(*data)[i]; } res+='\0'; std:cout << res;

golang []byte 和 string相互转换

原文链接:golang []byte和string相互转换 测试例子 package main import ( "fmt" ) func main() { str2 := "hello" data2 := []byte(str2) fmt.Println(data2) str2 = string(data2[:]) fmt.Println(str2) } 测试结果: [[email protected] ]# go run d.go [104 101 108 10

json对象与string相互转换教程

一.说明 1.1 背景说明 json对象与string相互转换,这东西想写了很多次,但总觉得网上教程比较成熟,所以之前每次都放弃了.但今天又被string转json对象折腾了半天,实在受不了,所以还是要写一写. 2.1 问题明确 首先要明确,python里有json这个库,但并没有json这个类,所以所谓的json对象本质上就是一个dict:而json这个库,用于实现dict到string.string到dict的互转. 更具体一点,json对象(dict)转string用json.dumps(

实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----------------------------------------------vcBuf.resize(stBuf.size());vcBuf.assign(stBuf.begin(), stBuf.end()); vector 转 string  stBuf.clear();stBuf.assign(v

C++Builder String 转 char* (转)

源:http://blog.csdn.net/bannico/article/details/7577728 使用C++ Builder 处理字符串经常会遇到兼容性问题. 这次要将String 类型 转成 char*  查了很多方法,最终如此解决: void LoadFile(String aFile) { AnsiString MyString = aFile; //声明一个AnsiString类型以接受aFile; char *f = MyString.c_str(); //注String.

【转载】xml与String相互转换

在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化的XML Document.这就涉及到XML字符串和Xml Document的转换问题,说白了这是个非常简单的问题,本文就各种XML解析器分别列举如下,以方便自己今后查阅. 一.使用最原始的javax.xml.parsers,标准的jdk api // 字符串转XMLString xmlStr = \"......\";StringReader sr = new StringReader(xmlStr); Input

String Buffer和String Builder(String类深入理解)

String在Java里面JDK1.8后它属于一个特殊的类,在创建一个String基本对象的时候,String会向“ 字符串常量池(String constant pool)” 进行检索是否有该数据(字符串)存在,如果存在则向该数据进行实例引用,返回到创建的String对象.所以当创建两个不同名字,相同字符串的常量时,不可能会有两个不同的存储内存. String常量,在JDK1.8后便可以任意修改,不会创建新的内存地址对内存应用的浪费. (常量与常量比较) String de="你好婷婷&quo

int和string相互转换

int --> String int -> Stringint i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); String --> ints="12345";int i;第一种方法:i=Integer.parseInt(s);第二种方法:i=Integer.valueOf(s).intValue();