REG_SZ值保存为日文文本

时间:2014-05-28 20:18:57

标签: c++

我正在尝试通过RegSetValueEx向Windows注册表写入一些值,但是,值以“日语形式”保存。 例如:

<整>“整瑳湩ㅧ㌲”应为“testing123”

在十六进制编辑器中查看文本时,文本看起来是正确的值,但前缀为“FF FE”,这似乎是一个字节顺序标记。

保存值的代码如下:

RegSetValueEx(
    RegistryUtils::registryKey,
    L"test",
    0,
    REG_SZ,
    (unsigned char*)config.getTestValue().c_str(),
    strlen(config.getTestValue().c_str()) + 1
);

其中config.getTestValue()返回std::string类型。

如何防止“FF FE”被添加到所需的字符串之前?

2 个答案:

答案 0 :(得分:0)

RegSetValueExW的字符串数据需要是宽文本,size参数需要是字节数,包括终止零。

这很好用:

#undef UNICODE
#define UNICODE
#include <windows.h>

#include <string.h>     // strlen

namespace RegistryUtils
{
    auto const registryKey = HKEY_CURRENT_USER;
};

auto main()
    -> int
{
    wchar_t const* const s = L"blah";

    RegSetValueEx(
        RegistryUtils::registryKey,
        L"test",
        0,
        REG_SZ,
        reinterpret_cast<BYTE const*>( s ),
        sizeof(wchar_t)*(wcslen(s) + 1)
    );
}

阅读the documentation有问题的功能是个好主意。

答案 1 :(得分:0)

您正在调用RegSetValueEx()的Unicode版本,该版本需要UTF-16格式的字符串数据,但您要传递Ansi数据。将您的数据放入std::wstring而不是std::string,同时请记住RegSetValueEx()对字节进行操作,而不是字符:

std::wstring value = config.getTestValueW(); // <-- for you to implement
RegSetValueEx(
    RegistryUtils::registryKey,
    L"test",
    0,
    REG_SZ,
    (BYTE*) value.c_str(),
    (value.length() + 1) * sizeof(WCHAR)
);