以下可能不符合SO问题; 如果它超出范围,请随时告诉我离开.这里的问题基本上是,"我是否正确理解C标准,这是正确的方法吗?"
我想请求澄清,确认和更正我对C中字符处理的理解(以及C++和C++ 0x).首先,一个重要的观察:
可移植性和序列化是正交概念.
便携式东西就像C unsigned int, wchar_t. 可序列化的东西就像uint32_t或UTF-8."Portable"意味着您可以重新编译相同的源并在每个支持的平台上获得工作结果,但二进制表示可能完全不同(或者甚至不存在,例如TCP-over-carrier pigeon).另一方面,可序列化的东西总是具有相同的表示,例如我可以在Windows桌面,手机或牙刷上读取的PNG文件.便携式东西是内部的,可序列化的东西处理I/O. 便携式东西是类型安全的,可序列化的东西需要打字.</前导>
当谈到C中的字符处理时,有两组分别与可移植性和序列化相关:
wchar_t,setlocale(),mbsrtowcs()/ wcsrtombs():C标准只字未提"编码" ; 事实上,它与任何文本或编码属性完全无关.它只说"你的入口点是main(int, char**);你得到的类型wchar_t可以容纳你所有系统的字符;你得到的函数来读取输入字符序列并使它们成为可行的字符串,反之亦然.
iconv()和UTF-8,16,32:在定义明确的固定编码之间进行转码的函数/库.由iconv处理的所有编码都得到普遍理解和同意,但有一个例外.
C的便携式,编码不可知世界与其wchar_t可移植的字符类型和确定性外部世界之间的桥梁是WCHAR-T和UTF之间的iconv转换.
那么,我是否应该始终将我的字符串内部存储在与编码无关的wstring,与CRT via的接口中wcsrtombs(),并iconv()用于序列化?概念:
my program
<-- wcstombs --- /==============\ --- iconv(UTF8, WCHAR_T) -->
CRT | wchar_t[] | <Disk>
--- mbstowcs --> \==============/ <-- iconv(WCHAR_T, UTF8) ---
|
+-- iconv(WCHAR_T, UCS-4) --+
|
... <--- (adv. …Run Code Online (Sandbox Code Playgroud) 任何人都可以帮助转换string为LPWSTR
string command=obj.getInstallationPath()+"<some string appended>"
Run Code Online (Sandbox Code Playgroud)
现在我打算把它作为参数传递给 CreateProcessW(xx,command,x...)
但是,createProcessW()只接受LPWSTR,所以我需要转换string到LPWSTR
提前致谢
我知道在SO的几个问题中已经讨论过这个问题,但这些解决方案都没有对我有用.
我从a开始,char*因为这是一个将从VBA调用的DLL,并且char*是VBA将字符串传递给DLL所必需的.
我需要返回一个LPCWSTR因为这是我试图调用的API函数的输入参数,并且我无法通过在"属性"窗口中从Unicode切换到多字节字符集来启用强制转换,因为API具有以下代码:
#if !defined(UNICODE) && !defined(NOUNICODE)
#error UNICODE is not defined. UNICODE must be defined for correct API arguments.
#endif
Run Code Online (Sandbox Code Playgroud)
我试过这个:
LPCWSTR convertCharArrayToLPCWSTR(char* charArray)
{
const char* cs=charArray;
wchar_t filename[4096] = {0};
MultiByteToWideChar(0, 0, cs[1], strlen(cs[1]), filename, strlen(cs[1]));
}
Run Code Online (Sandbox Code Playgroud)
出现这些错误:
error C2664: 'strlen' : cannot convert parameter 1 from 'const char' to 'const char *'
error C2664: 'MultiByteToWideChar' : cannot convert parameter 3 from 'const char' to 'LPCCH'
Run Code Online (Sandbox Code Playgroud)
我试过这个(相同的函数头),从这篇文章中松散地改编:
size_t retVal; …Run Code Online (Sandbox Code Playgroud) 如何从ANSI字符(char)转换为Unicode字符(wchar_t),反之亦然?
是否有用于此目的的跨平台源代码?