首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UTF-8解码库

UTF-8解码库
EN

Stack Overflow用户
提问于 2012-06-25 18:10:09
回答 3查看 2.2K关注 0票数 3

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-25 18:16:05

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

票数 3
EN

Stack Overflow用户

发布于 2012-06-25 18:17:52

是的,std::string是合适的,但正如你已经注意到的,它只在字节上操作,而不是Unicode代码点。在这一点上,std::string是一种不透明的类型;这不一定是不好的(事实上,它确实有一些优点,请参阅下面的链接以获取信息),但如果您需要有关字符的信息,则需要对字符串进行解码。

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

此外,我建议阅读UTF-8 everywhere manifesto,以获得有关使用UTF8与其他Unicode转换的一些信息。

票数 2
EN

Stack Overflow用户

发布于 2012-06-25 18:14:35

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

请注意,"Windows“编码并不等同于ISO-8859-1,但在大多数情况下,人们现在使用的是ISO-8859-1。

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

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

代码语言:javascript
复制
len = mblen(str.c_str(), str.length());

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11187283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档