【发布时间】:2013-10-28 15:09:01
【问题描述】:
我想用这样的特殊字符更改字符串中的顺序:
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;
但在这种情况下,我在 text1.size() 中遇到了问题,因为每个特殊字符都被计算了两次:
ZAŻÓŁĆ GĘŚLĄ JAŹŃ!
13 27
!\203Ź\305AJ \204\304L\232Ř\304G \206āœû\305AZ
如何正确反转带有特殊字符的字符串?
【问题讨论】:
-
FWIW,您不需要为
std::reverse使用反向迭代器。 (并不是说它会改变结果,但很高兴知道) -
@KerrekSB:不,不会,如果字符被分解。我开始怀疑,因为
\304看起来很像U+0304,这是一个分解的变音符号。 -
@MSalters:确实,好点。
-
老实说,从 Unicode 开始,这是一个非常困难的问题。 C++ 在那里一点帮助也没有。见stackoverflow.com/questions/16629183/…
-
@MSalters IMO 仅仅正确地说明问题就够难了。
标签: c++ string unicode reverse