在不使用ILU的情况下,在C ++中创建跨平台的与语言环境无关的字符串代码的最佳方法

时间:2013-11-06 22:32:28

标签: c++ string cross-platform locale

背景(通过它对于问题的范围并不重要):我正在开发基于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

但我不知道它是否是正确的轨道(它是跨平台的吗?它可以更容易完成吗?)

  • 第二个问题:显然我不能依赖sprintf。我的想法是编写自己的打印格式化文本函数,但也许有一些更简单的方法?

啊,我不想在我的框架中使用UTF-8作为本机格式 - 它太简单了,不能对字符串做简单的任务(比如子串,从索引中获取char等) - 你必须遍历整个字符串并确保拾取索引处的字节实际上是char,而不是其他char的实体等。)

修改

要明确的是,非UTF8规则不是我的交易破坏者,因为它的局限性而仅仅是气馁。但是,如果唯一正确的方法是UTF-8(专业人士强烈反对),那么它是可以接受的答案

0 个答案:

没有答案