2

この「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]);

「汉字」の代わりに意味不明なテキストが表示されました。

4

2 に答える 2

4

純粋な 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;
}
于 2011-08-30T14:43:52.597 に答える
3

文字列が utf8 としてエンコードされている場合は、非常に単純です。最初のバイトのみを検査することで、整形式のutf8 シーケンスの長さを取得できます。

最初のパスでは、utf8 の「サブシーケンス」 (長さ > 1 のもの)のみを逆にします。2 番目のパスでは、文字列全体を逆にします。出来上がり。

于 2011-08-30T12:22:54.930 に答える