Gra*_*amS 9 c++ string visual-c++
我有一个LPCTSTR
想要调用带std::string
参数的函数.
我需要做什么转换?
Jon*_*Jon 16
LPCTSTR
可以是单字节字符串也可以是多字节字符串(取决于UNICODE
编译期间定义的常量或不是),而std::string
用户(包括您的函数)通常使用它来保存单字节字符串.
您需要两次转换:一次用于LPCSTR
(非UNICODE
构建),一次用于LPCWSTR
(UNICODE
构建).第一个很简单:
std::string convert(LPCSTR str) {
return std::string(str);
}
Run Code Online (Sandbox Code Playgroud)
第二个需要将其输入参数首先转换为另一个编码WideCharToMultiByte
.不要被名称吓到,结果可以是单字节字符串; 这取决于CodePage
参数.您必须使用代码页进行单字节编码,例如CP_ACP
.
更新:WideCharToMultiByte
示例
请注意,如果输入字符串包含目标编码的代码页中不存在的字符,则在技术上不可能准确地转换为单字节编码.由于您提到它将用于文件系统功能,如果文件路径包含此类字符,则转换将不会100%准确,并且后续函数调用将失败.
std::string MBFromW(LPCWSTR pwsz, UINT cp) {
int cch = WideCharToMultiByte(cp, 0, pwsz, -1, 0, 0, NULL, NULL);
char* psz = new char[cch];
WideCharToMultiByte(cp, 0, pwsz, -1, psz, cch, NULL, NULL);
std::string st(psz);
delete[] psz;
return st;
}
Run Code Online (Sandbox Code Playgroud)
警告:上面的例子来自我所说的一些代码,并不是生产级质量.一个明显的缺陷是它不是例外安全的.它也可能杀死所有漂亮的紫色独角兽.仅用它作为例子.
赤裸裸的事实是,std::string
可用于多字节编码(如UTF-8)就好了-你甚至可以用它来保存宽字符的字符串,因为它是字节的心脏只是一个二进制安全数组.
问题是STL函数适用于std::string
期望其内容采用单字节编码,如果不是这样,它们将不会产生正确的结果.
通过扩展,我们不知道std::string
参数所需的函数是什么 - 它可能期望以UTF-8编码的字符串.但是"按惯例",我假设它也想要一个单字节编码的字符串.
归档时间: |
|
查看次数: |
42923 次 |
最近记录: |