[英]Reverse a string containing ASCII chars and non-ASCII chars
我有一个有关如何反转包含此“ abcd汉字efg”的字符串的问题。
str_to_reverse = "abcd汉字efg"; /* those non-ASCII chars are Chinese characters, each of them takes 2 bytes */
还原后,应为:
str_toreverse = "gfe字汉dcba";
我认为,要反转字符串,我必须识别那些非ASCII字符,因为我认为仅仅反转每个字节都不会得到正确的答案。
我该怎么做?
PS:我是在32位Ubuntu下编写此程序的。 然后我打印了每个字节:
for(i = 0; i < strlen(s); i++)
printf("%c", s[i]);
我收到了一些乱七八糟的文字,而不是“汉字”。
纯C89答案:
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <string.h>
int main()
{
char const* str;
size_t slen;
char* rev;
setlocale(LC_ALL, "");
str = "abcd汉字efg";
printf("%s\n", str);
slen = strlen(str);
rev = malloc(slen+1)+slen;
*--rev = '\0';
while (*str != '\0') {
int clen, i;
clen = mblen(str, slen);
if (clen == -1) {
fprintf(stderr, "Bad encoding\n");
return EXIT_FAILURE;
}
for (i = 0; i < clen; ++i) {
*--rev = str[clen-1-i];
}
str += clen;
}
printf("%s\n", rev);
return 0;
}
如果字符串编码为utf8,则非常简单。 您只需检查第一个字节即可获得格式正确的 utf8序列的长度。
在第一遍中,您仅反转utf8“子序列”(长度大于1的子序列);在第二遍中,您反转了整个字符串。 瞧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.