4

次のような特殊文字を使用して文字列の順序を変更したい:

ZAŻÓŁĆ GĘŚLĄ JAŹŃ

ŃŹAJ ĄŁŚĘG ĆŁÓŻAZ

std::reverse を使用しようとしています

std::string text("ZAŻÓŁĆ GĘŚLĄ JAŹŃ!");
std::cout << text << std::endl;
std::reverse(text.rbegin(), text.rend());
std::cout << text << std::endl;

しかし、出力は次のことを示しています:

ZAŻÓŁĆ GĘŚLĄ JAŹŃ!

!\203Ź\305AJ \204\304L\232Ř\304G \206āœû\305AZ <- 逆文字列

だから私はこれを「手動で」やってみます:

std::string text1("ZAŻÓŁĆ GĘŚLĄ JAŹŃ!");
std::cout << text1 << std::endl;
int count = (int) floorf(text1.size() /2.f);
std::cout << count  << "  " << text1.size() << std::endl;

unsigned int maxIndex = text1.size() - 1;
for (int i = 0; i < count ; i++)
{
    char tmp = text1[i];
    text1[i] = text1[maxIndex];
    text1[maxIndex] = tmp;
    maxIndex--;
}
std::cout << text1 << std::endl;

しかし、この場合、すべての特殊文字が 2 回カウントされるため、text1.size() に問題があります。

ZAŻÓŁĆ GĘŚLĄ JAŹŃ!

13 27 <- 2 番目の数値は text1.size()

!\203Ź\305AJ \204\304L\232Ř\304G \206āœû\305AZ

特殊文字を含む文字列を逆にする適切な方法は?

4

4 に答える 4

0

自分で reverseUt8 関数をコーディングできます。

std::string getMultiByteReversed(char ch1, char ch2)
{  
   if (ch == '\xc3') // most utf8 characters
      return std::string(ch1)+ std::string(ch2);
   } else {
      return std::string(ch1);
   }
}

std::string reverseMultiByteString(const std::string &s)
{
    std::string result;
    for (std::string::reverse_iterator it = s.rbegin(); it != s.rend(); ++it) {
       std::string reversed;
       if ( (it+1) != rbegin() && (reversed = getMultiByteReversed(*it, *it+1) ) {
          result += reversed;
          ++it;
       } else {
          result += *it;
       }
  }
  return result;
}

http://www.utf8-chartable.de/で utf8 コードを調べることができます。

于 2017-08-29T09:21:11.317 に答える
-4

キャラクターを1つずつ入れ替えてみましたか?たとえば、文字列の長さが奇数の場合、最初の文字を最後の文字と入れ替え、2 番目の文字を最後から 2 番目の文字と入れ替えて、真ん中の文字を残します。文字列の長さが偶数の場合、真ん中の文字が両方とも入れ替わるまで、1 番目と最後、2 番目と最後 2 番目を入れ替えます。このように、文字列が逆になります。

于 2013-10-28T15:27:44.080 に答える