C++ 如何迭代std::string以获得一组Freetype FT_ULong?
C++ 如何迭代std::string以获得一组Freetype FT_ULong?,c++,string,freetype,C++,String,Freetype,std::string通常被解释为UTF8,因此具有可变长度编码。在我的字体渲染器中,我遇到了一个问题,我不知道如何从std::string中获取一个“字符”,并将其转换为FreetypeFT\u ULong,以便获得具有FT\u get\u Char\u索引的字形。也就是说,我不确定我所做的是否“正确”,因为我只是在迭代std::string并将结果字符转换过来(当然这是不正确的,尽管它适用于我的操作系统默认设置) 那么,有没有一种“正确”的方法来做到这一点,更重要的是,有没有人编写了一个库来
std::string
通常被解释为UTF8,因此具有可变长度编码。在我的字体渲染器中,我遇到了一个问题,我不知道如何从std::string中获取一个“字符”,并将其转换为FreetypeFT\u ULong
,以便获得具有FT\u get\u Char\u索引的字形。也就是说,我不确定我所做的是否“正确”,因为我只是在迭代std::string
并将结果字符转换过来(当然这是不正确的,尽管它适用于我的操作系统默认设置)
那么,有没有一种“正确”的方法来做到这一点,更重要的是,有没有人编写了一个库来实现这种“正确”的方法,我可以使用现成的方法?您应该首先检查UTF8是如何编码的,并且知道什么样的起始位和多少字节
看
然后您可以编写如下代码:
if ((byte & 0x80) == 0x00) {
// 1 byte UTF8 char
}
else if ((byte & 0xE0) == 0xC0) {
// 2 bytes UTF8 char
}
else if ...
然后,您可以使用正确的字节重复std::string中的每个UTF8字符。您知道如何编码吗?只要从字符串中读取下一个“字符”,您就会知道当前代码点需要多少字节,以及如何将其解析为任何其他编码。或者您也可以将其转换为UTF-16(甚至UTF-32)。标准中没有任何内容,但ICU、glib,请参见此处:(ICU将是最有力的选择,但它是一个相当大的选择beast@leemes:UTF-16也是一种可变长度编码。我想知道是否有一个简单的函数可以将UTF8转换为32位(无符号长).虽然我读的UTF8最多可以有6个字节,这似乎有点过多,但出于所有实际目的…我想我还需要一个函数来确定字符串的格式是否正确。