C ++: итерация символа над строкой (я схожу с ума) - PullRequest
1 голос
/ 17 декабря 2010

У меня есть эта строка:

std::string str = "presents";

И когда я перебираю символы, они приходят в следующем порядке:

spresent

Итак, последний символ идет первым.

Это код:

uint16_t c;
printf("%s: ", str.c_str());
for (unsigned int i = 0; i < str.size(); i += extractUTF8_Char(str, i, &c)) {
    printf("%c", c);
}
printf("\n");

И это метод извлечения:

uint8_t extractUTF8_Char(string line, int offset, uint16_t *target) {
 uint8_t ch = uint8_t(line.at(offset));
 if ((ch & 0xC0) == 0xC0) {
  if (!target) {
   return 2;
  }
  uint8_t ch2 = uint8_t(line.at(offset + 1));
  uint16_t fullCh = (uint16_t(((ch & 0x1F) >> 2)) << 8) | ((ch & 0x3) << 0x6) | (ch2 & 0x3F);
  *target = fullCh;
  return 2;
 }
 if (target) {
 *target = ch;
 }
 return 1;
}

Этот метод возвращает длину символа. Итак: 1 байт или 2 байта. И если длина составляет 2 байта, она извлекает точку UNICODE из строки UTF8.

1 Ответ

17 голосов
/ 17 декабря 2010

ваш первый printf печатает ерунду (начальное значение c). Последний полученный c не печатается.

Это потому, что вызов extractUTF8_char происходит в последнем предложении оператора for. Возможно, вы захотите изменить его на

for (unsigned int i = 0; i < str.size();) {
    i += extractUTF8_Char(str, i, &c);
    printf("%c", c);
}

вместо.

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