проверить наличие недопустимых символов в (возможных) китайских строках - PullRequest
1 голос
/ 19 апреля 2020

Итак, у меня есть эта функция в большой кодовой базе, которая проверяет наличие недопустимых символов, которые выглядят примерно так:

validateMe(std::string myString)
{
  for (int i = 0; i < myString.length(); i++)
  {      
    if ((myString[i] == 0x7E) || ...)
    {
      return NOT_VALID_STRING;
    }
  }
  return VALID_STRING;
}

перед вызовом validateMe, строка была преобразована в UTF8.

Теперь Это работало нормально, пока не было проверено на китайские иероглифы.

Я прохожу через http://utf8everywhere.org/, пытаюсь лучше понять все, но это как глубокая ядовитая дыра, в которую я попадаю.

Я думаю, я Я должен как-то найти кодовые точки, проверить, находится ли каждый в допустимом диапазоне, где находятся недопустимые символы, и если да, то я могу искать недопустимые символы. Но как мне найти кодовые точки?

Я читал, что std :: string может справиться с этим, но

myString.find("~") != std::string::npos

не удается с китайскими символами, я думаю, потому что первые куски китайского иероглифа 0x7E. По крайней мере те, которые я пробовал.

Итак, как проверить наличие недопустимых символов в строке, которая может быть написана на китайском языке? Предположим, что китайский EU C -CN.

EDIT:

validateMe ("testme") должен пройти

validateMe ("test ~ me") НЕ должен пройти

когда пользователь вводит символы «啊 是 的 发» (то есть первый символ для каждой буквы в «asdf» на китайском языке EU C -CN) через GUI, функция завершается ошибкой , На самом деле он находит "~" или 0x7E. Отладчик VS действительно переводит ввод как å • Šæ˜¯çš „å ', который имеет' ~ '.

1 Ответ

0 голосов
/ 19 апреля 2020

Вы не можете использовать std::string с символами Юникода, такими как китайский, потому что std::string поддерживает только символы ASCII. Вместо этого вы можете использовать std::wstring.

...