我正在尝试找出从远程计算机以统一方法检索unicode数据的最安全方法,并确保数据保持一致和可读性。
计算机A:中文用户,使用英语Windows 7混合语言,某些注册表值包含中文字母,例如L“您好”
计算机B:美国英语,我的函数未返回任何Unicode值
计算机C:向计算机A和B引入代理。
代理:从内部评估计算机的运行状况和安全性。一个了解unicode的部分只是获取注册表值,即:
int Utilities::GetRegistryStringValue(HKEY h_sub_key, WCHAR* value_name, wstring &result)
{
DWORD cbData = 8;
LPDWORD type = NULL;
//Get the size and type of the key
long err = RegQueryValueEx(h_sub_key, value_name, NULL, type, NULL, &cbData);
if (err != ERROR_SUCCESS)
{
if (err != ERROR_FILE_NOT_FOUND)
debug->DebugMessage(Error::GetErrorMessageW(err));
return err;
}
result.resize(cbData / sizeof(WCHAR));
LPWSTR res = new WCHAR[(cbData + sizeof(L'\0')) / sizeof(WCHAR)];
err = RegQueryValueEx(h_sub_key, value_name, NULL, NULL, (LPBYTE) &res[0], &cbData);
if(err != ERROR_SUCCESS && err != ERROR_FILE_NOT_FOUND)
{
debug->DebugMessage(Error::GetErrorMessageW(err));
return err;
}
res[cbData / sizeof(WCHAR)] = L'\0';
result = wstring(res);
return ERROR_SUCCESS;
}
这些值将存储在XML文件中。
该XML文件应采用UTF16还是UTF8?
我需要传回远程系统的代码页进行翻译吗?
我还有什么其他问题?
最佳答案
UTF8更标准(用于网络),因为它没有字节序问题。对于UTF16,您需要指定传输的字节序。如果您使用unicode格式,则不需要代码页。
如果它们在Windows计算机上,则可以使用标准Windows调用(例如WideCharToMultiByte)进行翻译。
std::wstring buffer_with_utf16;
const char DefaultChar = 1; //not null, but not normal either
bool had_conversion_error = false;
int alength = WideCharToMultiByte(CP_UTF8, 0,
buffer_with_utf16.cstr(), buffer_with_utf16.size(),
NULL, 0,
&DefaultChar, &had_conversion_error);
if (alength == 0)
throw std::logic_error("Bad UTF8 conversion"); //use GetLastError
std::string buffer_with_utf8(alength+1);
int error = WideCharToMultiByte(CP_UTF8, 0,
buffer_with_utf16.cstr(), buffer_with_utf16.size(),
&buffer_with_utf8[0], buffer_with_utf8.size(),
&DefaultChar, &had_conversion_error);
if (error == 0)
throw std::logic_error("Bad UTF8 conversion"); //use GetLastError
关于c++ - 跨网络Unicode到xml,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7932074/