char的默认类型大部分是signed,教科书上也这么讲,所以一般遇不到什么问题,但是在arm上出问题了,默认char是unsigned,导致c<0永远失败。
代码是这样的:
//计算输出长度size_t outputlen(string const & s){//cout << s << " " << s.size() << " " << strlen(s.c_str()) << " outputlen " << utf8outputlen(s.c_str()) << endl;return utf8outputlen(s.c_str());}//utf-8中文通常为3个字节,输出仍为两个字符宽度size_t utf8outputlen(char const * s){char const * p = s;//原来的代码signed char const * p = (signed char const* )s;//修正的代码long count_ansi = 0;long count_other = 0;while (*p){if (*p < 0)++count_other;else ++count_ansi;++p;}return count_ansi + count_other * 2 / 3;}
这个代码功能很简单,计算utf-8字符串实际的输出宽度,因为大部分中文都是3字节,而输出是2字节,所以就简单地乘除了一下,可能会有一些小小的误差(目前我都没有发现过)。
这代码用了有快二十年了吧。
在arm64的板子上,这个代码失效了,导致输出的文本表格宽度错误,一个中文字符差一个宽度,跟踪了一下发现,这个代码功能失效,并没有识别出中文字符。
脑袋一拍想到该不会默认是无符号吧,一试果然。
BUG解决了,该学到什么自己思考。
(这里是结束)