跳到主要内容

字符串 HXString

在 HiEasyX 里,字符串不是 std::string,而是 HXString。别慌,这个设计是有原因的——框架全程在 UNICODE 模式下编译,所有字符串内部都用宽字符存储,这样才能完美支持中文、日文、emoji 以及各种国际字符。


类型定义

using HXString = std::wstring;   // UNICODE 模式下的真面目
信息

如果你在代码里看到 HXString,就当作 std::wstring 来理解,完全等价,只是名字更短、更有框架辨识度。


HXStr 宏:告别手动加 L

写宽字符字符串最烦的就是每个字面量前面都要加 L,比如 L"你好"。HiEasyX 提供了一个偷懒神器:

#define HXStr(text) L##text

用法超级简单:

HX::Button(HXStr("点击我"), profile);      // 展开为 L"点击我"
HX::Window(HXStr("主窗口"), profile); // 展开为 L"主窗口"
HX::Text(HXStr("Hello 世界")); // 中英文混写无压力
提示

建议:所有传给 HiEasyX 控件的字符串字面量,都用 HXStr(...) 包裹。这是框架的惯例,能让代码风格保持一致,也避免忘记加 L 导致的编译惨案。


ToHXString:万物皆可转字符串

框架内置了一个模板函数,能把各种基础类型转成 HXString

template<typename T>
HXString ToHXString(const T& value);

支持常见的数值类型、枚举等:

int count = 42;
float pi = 3.14f;
HXString s1 = HX::ToHXString(count); // L"42"
HXString s2 = HX::ToHXString(pi); // L"3.14"
提示

自定义类型也可以支持 ToHXString,只要给类型重载 operator<<std::wostream 即可,模板会自动 pick 到。


HXString ↔ std::string 转换

有时候你不可避免地要跟纯 ASCII 的 std::string 打交道(比如读配置文件、网络协议、第三方库)。这时候需要手动做编码转换:

// std::string 与 HXString 的转换函数暂未提供,建议手动使用 MultiByteToWideChar / WideCharToMultiByte
危险

千万别干这种事

std::string narrow = "中文";
HXString wrong(narrow.begin(), narrow.end()); // ❌ 乱码!

这种构造只是按字节复制,完全不管编码,中文直接变问号或乱码。


实战技巧:MessageBox、printf、日志

MessageBoxW

Windows 的 MessageBox 分 A 版和 W 版,HiEasyX 用 W 版:

HXString msg = HXStr("操作成功完成");
MessageBoxW(nullptr, msg.c_str(), HXStr("提示"), MB_OK);

格式化字符串

宽字符版的 printfwprintf,格式说明符前面加 l

int fps = 60;
wprintf(L"当前帧率: %d\n", fps);

// 或者格式化成 HXString
wchar_t buf[256];
snwprintf(buf, 256, L"FPS: %d | 对象数: %d", fps, objectCount);
HXString status(buf);

与 std::wcout 配合

std::wcout << HXStr("正在初始化...") << std::endl;
信息

%ls 也可以用来在 snwprintf 里嵌套另一个 HXString

HXString name = HXStr("玩家1");
wchar_t buf[256];
snwprintf(buf, 256, L"欢迎, %ls!", name.c_str());

一句话总结

场景写法
字面量HXStr("文本")
类型声明HXString
数值转字符串HX::ToHXString(value)
UTF-8 转换HX::Utf8ToHXString / HX::HXStringToUtf8
Windows API用带 W 后缀的宽字符版本
提示

把心放宽:HXString 就是 std::wstring,你会用 std::string 就会用它。唯一要注意的就是字面量加 HXStr(...),以及和窄字符串转换时走 UTF-8 通道,别直接暴力拷贝。