Конвертировать utf-8 std :: string в std :: wstring на iPhone - PullRequest
3 голосов
/ 31 августа 2010

У меня есть строка UTF-8 (создал std :: string из байтового массива) Я понимаю, что кодировка означает, что size () / length () не даст мне фактическое количество глифов, если текст, например, китайский ... Я понимаю, что для того, чтобы получить код символа Unicode для каждого символа, мне нужно преобразовать его в wstring (или любое представление UTF> 8), а затем я могу получить значение, которое будет представлять то, что я хочу.

Я огляделся и не нашел простого способа сделать это с помощью std c ++. Чего мне не хватает?

Я собираю gcc 4+ на iPhone от Apple, используя платформу Cocoa-Touch.

Ответы [ 5 ]

2 голосов
/ 31 августа 2010

Прежде всего, даже если вы преобразуете свою строку UTF-8 в UTF-32 (и сохраните ее в wstring), это не означает, что каждый wchar_t будет соответствовать одному глифу.См. Этот текст для некоторых из проблем: http://www.unicode.org/reports/tr15/.

Сказав, что, если вам действительно нужно преобразовать кодированную строку UTF-8 в UTF-32, вы можете использовать UTF-8 Библиотека CPP как это:

wstring utf32result;
utf8::utf8to32(utf8string.begin(), utf8string.end(), back_inserter(utf32result));
2 голосов
/ 31 августа 2010

Чтобы получить количество utf8 'символов / кодовых точек' в std :: string, вы можете сделать это: Пройдите по строке, если char находится между 0 и 127, это однобайтовый символмежду 194 и 223 это 2-байтовый символ (так что, следовательно, повышение), между 224 и 239 это 3-байтовый символ (поэтому, следовательно, повышение), между 240 и 244 это 4-байтовый символ (поэтому, как следствие).

Поскольку wchar_t на Iphone, я думаю, 32 бита, если вы действительно хотите wstring , вы можете использовать UTF8CPP для преобразования в UTF32.UTF8CPP также может дать вам кодовые строки вашей строки.

Но я не понимаю, почему вы используете C ++ для Iphone?Смотрите здесь: Objective-C Вторники: широкие строки символов

1 голос
/ 31 августа 2010

Повышение обеспечивает кодировку UTF-8 фасета .Вы должны иметь возможность вызывать его напрямую для выполнения преобразований между байтами в кодировке UTF-8 и 32-битным wchar_t.

0 голосов
/ 31 августа 2010

Ну, это не просто, и я не использовал это сам, но классы locale должны помочь с преобразованием вашей строки. Из описания вы можете использовать метод ctype :: widen для преобразования между char и wchar.

0 голосов
/ 31 августа 2010

В стандарте C ++ отсутствует понятие utf-8 или unicode.Вы должны проверить доступные API или внешние библиотеки для выполнения ваших преобразований.

Или вы можете сами сделать функцию проверки действительного количества символов из std :: string в кодировке utf-8, я думаю, что это не такэто трудно, если вы знаете, как работает utf-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...