【发布时间】:2013-01-07 10:14:47
【问题描述】:
我正在解析一个文件,其中包含不同编码的各种字符串。这些字符串的存储方式是这样的:
0xFF 0xFF - block header 2 bytes
0xXX 0xXX - length in bytes 2 bytes
0xXX - encoding (can be 0, 1, 2, 3) 1 byte
... - actual string num bytes per length
这通常很容易,但是我不确定如何处理编码。编码可以是以下之一:
0x00 - regular ascii string (that is, actual bytes represent char*)
0x01 - utf-16 with BOM (wchar_t* with the first two bytes being 0xFF 0xFE or 0xFE 0xFF)
0x02 - utf-16 without BOM (wchar_t* directly)
0x03 - utf-8 encoded string (char* to utf-8 strings)
我需要以某种方式读取/存储它。最初我想的是简单的string,但这不适用于wchar_t*。然后我考虑将所有内容都转换为wstring,但这将是相当多的不必要的转换。接下来想到的是boost::variant<string, wstring>(我已经在代码的另一个地方使用了boost::variant)。在我看来,这是一个合理的选择。所以现在我有点难以解析它。我正在考虑以下几点:
//after reading the bytes, I have these:
int length;
char encoding;
char* bytes;
boost::variant<string, wstring> value;
switch(encoding) {
case 0x00:
case 0x03:
value = string(bytes, length);
break;
case 0x01:
value = wstring(??);
//how do I use BOM in creating the wstring?
break;
case 0x02:
value = wstring(bytes, length >> 1);
break;
default:
throw ERROR_INVALID_STRING_ENCODING;
}
因为我只是稍后打印这些字符串,所以我可以将 UTF8 存储在一个简单的 string 中而无需太多麻烦。
我的两个问题是:
这种方法是否合理(即使用 boost::variant)?
如何使用特定的 BOM 创建
wstring?
【问题讨论】:
-
看看这里:stackoverflow.com/questions/402283/stdwstring-vs-stdstring(最佳答案),如果你在 Windows 上只有 wstring 是一个可靠的选择,我的意思是整个软件不是 Variant 方法,如果你计划跨平台我建议使用 QT 的文本转换功能(在 QString 中处理所有这些)
-
@Najzero 我是在linux上开发的,但是结果必须能够在windows、linux和mac os x下编译。另外,请注意,我的目标是在任何平台上静态编译的可执行文件少于 300K(超出要求,我不控制这些),因此链接 ICU 或 QT 很可能不是一个选项。
标签: c++ string unicode byte-order-mark wstring