在iPhone上将utf-8 std :: string转换为std :: wstring

时间:2010-08-31 10:50:50

标签: c++ iphone string utf-8

我有一个UTF-8字符串(从字节数组创建一个std :: string) 据我所知,编码意味着如果文本是中文的话,size()/ length()不会给我实际的字形数... 我理解为了获得每个字形的unicode字符代码,我需要将其转换为wstring(或任何UTF> 8表示),然后我可以得到代表我想要的值。

我环顾四周,并没有找到任何简单的方法来使用std c ++。 我错过了什么?

我正在使用可可触摸框架在Apple的iPhone上编译gcc 4+。

5 个答案:

答案 0 :(得分:2)

要获取std :: string中utf8'字符/代码点'的数量,您可以这样做:遍历字符串,如果 char 介于0和127之间,则它是一个字节字符,在194和223之间,它是一个2字节字符(因此提前),在224和239之间它是一个3字节字符(因此提前),在240和244之间它是一个4字节字符(因此提前)。

因为Iphone上的 wchar_t ,我想,32位,如果你真的想要 wstring ,你可以使用UTF8CPP转换为UTF32。 UTF8CPP还可以为您提供字符串的代码点。

但是我不明白你为什么要在Iphone上使用C ++?看这里:Objective-C Tuesdays: wide character strings

答案 1 :(得分:2)

首先,即使您将UTF-8字符串转换为UTF-32(并将其存储在wstring中),也并不意味着每个wchar_t都对应一个字形。有关以下问题,请参阅此文:http://www.unicode.org/reports/tr15/

话虽如此,如果你真的需要将UTF-8编码的字符串转换为UTF-32,你可以像这样使用UTF-8 CPP library

wstring utf32result;
utf8::utf8to32(utf8string.begin(), utf8string.end(), back_inserter(utf32result));

答案 2 :(得分:1)

Boost提供UTF-8 codecvt facet。您应该能够直接调用它来执行UTF-8编码字节和32位wchar_t之间的转换。

答案 3 :(得分:0)

C ++标准中没有utf-8或unicode的概念。您应该检查可用的API或外部库以执行转换。

或者您可以自己执行从utf-8编码的std :: string中检查实际字符数的功能,我认为如果您知道utf-8如何工作并不困难。

答案 4 :(得分:0)

嗯,这并不简单,我自己没有使用它,但locale类应该有助于转换你的字符串。从描述中,您可以使用ctype :: widen方法在char和wchar之间进行转换。