背景(通过它对于问题的范围并不重要):我正在开发基于SDL的C ++游戏框架,它将在不同的平台上编译(Win / Lin / Mac / iOS / Android /等)和我需要良好的,跨平台的方式来存储依赖于语言环境的字符串,这种字符串不像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对象,因为我不需要担心它们的生命周期和时间/内存成本非常小。
问题:
执行与语言环境/平台无关的字符串是“正确的轨道”吗?或者也许我在Google上错过了更简单的解决方案?
我应该如何在代码中定义字符串(例如在Logger中使用)?
我的想法是使用这样的宏:
#define _U(str) WideToUStr(L##str)
// Then in code:
_U("Hello World zażółć gęślą jaźń"); // some polish special chars
但我不知道它是否是正确的轨道(它是跨平台的吗?它可以更容易完成吗?)
啊,我不想在我的框架中使用UTF-8作为本机格式 - 它太简单了,不能对字符串做简单的任务(比如子串,从索引中获取char等) - 你必须遍历整个字符串并确保拾取索引处的字节实际上是char,而不是其他char的实体等。)
修改
要明确的是,非UTF8规则不是我的交易破坏者,因为它的局限性而仅仅是气馁。但是,如果唯一正确的方法是UTF-8(专业人士强烈反对),那么它是可以接受的答案