背景(通过它对问题的范围并不那么重要):我正在开发基于 SDL 的 C++ 游戏框架,它将在不同的平台(Win/Lin/Mac/iOS/Android/etc.)上编译,我需要好的, 跨平台存储依赖于语言环境的字符串的方法,它不像 ICU 库那样臃肿是
wchar_t 在这里不是一个选项,因为它依赖于平台。您不能(例如)在 Linux 上保存游戏(wchar_t 长 4 字节)然后在 Windows 上加载(因为 wchar_t 长 2 字节)。
所以,我的想法是让通用字符串(UCS-2)成为我框架内的标准,并以此为基础制作游戏。我想在核心头文件中做简单的 typedef:
typedef unsigned short uchar
typedef std::basic_string<uchar> ustring
问题是许多底层库使用不同的字符串编码。所以我需要几个功能:
std::string UStrToAscii(const ustring & str);
ustring AsciiToUStr(const char * str);
std::string UStrToUtf8(const ustring & str);
ustring Utf8ToUStr(const char * str);
std::wstring UStrToWide(const ustring & str);
ustring WideToUStr(const wchar_t * str);
// etc.
我正在返回 STL 对象,因为我不需要担心它们的生命周期并且时间/内存成本非常小。
问题:
做区域设置/平台独立的字符串是“正确的轨道”吗?或者也许我在谷歌上错过了更简单的解决方案?
我应该如何在代码中定义字符串(例如在 Logger 中使用)?
我的想法是像这样使用宏:
#define _U(str) WideToUStr(L##str)
// Then in code:
_U("Hello World zażółć gęślą jaźń"); // some polish special chars
但是不知道是不是走对了(是跨平台的吗?能不能更容易完成?)
- 第二个问题:很明显我不能依赖 sprintf。我的想法是编写自己的打印格式化文本函数,但也许有一些更简单的方法?
啊,我不想在我的框架中使用 UTF-8 作为本机格式 - 对字符串执行简单任务(如子字符串、从索引中获取字符等)太复杂了 - 你必须遍历整个字符串并确保选择索引处的字节实际上是一个字符,而不是其他字符的实体等)
编辑
需要明确的是,非 UTF8 规则不是我的交易破坏者,它只是因为它的限制而气馁。但是,如果唯一正确的方法是使用 UTF-8(优点强于缺点),那么作为答案是可以接受的