3

我必须在 Windows MSVC 10 中使用 Unicode UTF-8 的应用程序中进行编码。我知道 UTF-8 编码的字符串每个字符将使用 1 个或 2 个字节。所以,我的问题是:std::string 适合这个吗?如果是,我如何解码字符串?据我了解 std::string 只是一个字节数组,它不提供任何解码逻辑。我怎么知道字符串的逻辑长度?如何从字符串中提取逻辑字符?是否有任何库可以帮助我从字符串中提取逻辑字符?

例如:如果我在 std::string 中有字符串“olé”,我需要知道长度是 3,而不是 4。

4

3 回答 3

3

一个常用的库是 ICU - International Components for Unicode

于 2012-06-25T10:16:04.627 回答
2

是的,std::string是适当的,但正如您所注意到的,它只对字节起作用,而不是 Unicode 代码点。其中,std::string是不透明类型;这不一定是坏事(事实上,它确实有一些优势,请参阅下面的链接以获取信息),但是如果您需要有关字符的信息,则有必要对字符串进行解码。

对于 UTF-8 的实际处理(如有必要),您可以使用Boost.NoWide库来解码 UTF-8。

此外,我建议阅读UTF-8 无处不在的宣言,以获取有关使用 UTF-8 与其他 Unicode 转换的一些信息。

于 2012-06-25T10:17:52.323 回答
-2

首先,您可能需要调用 mbstowcs() 函数将 UTF-8 字符转换为宽字符。然后,如果您希望结果为 8 位,则如果您有“Unicode”字符(ISO-8859-1 平面之外的字符,也称为拉丁 1),则会丢失数据。

请注意,“Windows”编码与 ISO-8859-1 不是 1 对 1 等价的,但在大多数情况下,ISO-8859-1 是当今人们使用的。

参考:http ://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs/

好的,如果您只想要字符长度,请使用 mblen() 函数:

len = mblen(str.c_str(), str.length());

附加说明:实现 mblen() 的一种简单方法是计算不在 0x80 和 0xBF 之间的字节数,因为它们是多字节序列的一部分。如果您通过不稳定的串行连接接收 UTF-8 字节序列,这将特别有用。

于 2012-06-25T10:14:35.220 回答