-1

我正在尝试从文本文件中读取不可打印字符,打印出字符的 ASCII 码,最后将这些不可打印字符写入输出文件。

但是,我注意到,对于我阅读的每个不可打印字符,在我真正想要阅读的内容前面总是存在一个额外的不可打印字符。

例如,我想读的字符是“§”。当我在我的程序中打印出它的 ASCII 码时,它不是只打印“167”,而是打印出“194 167”。

我在调试器中查找它并在 char 数组中看到“§”。但是我的输入文件中没有 Â。 调试器截图

在我将不可打印字符写入输出文件后,我注意到它也只是“§”,而不是“§”。

我读到的每个不可打印的字符都附加了一个额外的字符。为什么会这样?我该如何摆脱它?

谢谢!

代码如下:

        case 1:
            mode = 1;
            FILE *fp;
            fp = fopen ("input2.txt", "r");
            int charCount = 0;

            while(!feof(fp)) {
                original_message[charCount] = fgetc(fp);
                charCount++;
            }
            original_message[charCount - 1] = '\0';
            fclose(fp);

            k = strlen(original_message);//split the original message into k input symbols
            printf("k: \n%lld\n", k);

            printf("ASCII code:\n");
            for (int i = 0; i < k; i++)
            {
                ASCII = original_message[i];
                printf("%d ", ASCII);
            }
4

1 回答 1

1

C 的getchar(and getcand fgetc) 函数旨在读取单个字节。它们不会直接处理 Unicode 的 UTF-8 编码中出现的“宽”或“多字节”字符。

但是还有其他专门设计用于处理这些扩展字符的函数。特别是,如果你愿意,你可以用 替换你的调用fgetc(fp)fgetwc(fp)然后你应该能够开始阅读像§as 他们自己这样的字符。

您将必须#include <wchar.h>获得fgetwc. 你可能需要添加调用

setlocale(LC_CTYPE, "");

在您的程序顶部同步您的程序的字符集“区域设置”与您的操作系统的字符集。

不是你的原始代码,而是我写了这个小程序:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main()
{
    wchar_t c;
    setlocale(LC_CTYPE, "");
    while((c = fgetwc(stdin)) != EOF)
        printf("%lc %d\n", c, c);
}

当我输入“A”时,它会打印A 65. 当我输入“§”时,它会打印§ 167. 当我输入“Ƶ”时,它会打印Ƶ 437. 当我输入“†”时,它会打印† 8224.

现在,尽管如此,使用类似函数读取宽字符fgetwc并不是处理扩展字符的唯一或不一定是最好的方法。在您的情况下,它会带来许多额外的后果:

  1. 您的original_message数组必须是 的数组wchar_t,而不是 的数组char
  2. 你的original_message数组不会是一个普通的 C 字符串——它是一个“宽字符串”。所以你不能调用strlen它;你将不得不打电话wcslen
  3. 同样,您不能使用 打印它,也不能使用 打印它%s的字符%c。您必须记住使用%lsor %lc

因此,尽管您可以将整个程序转换为在w任何地方使用“宽”字符串和“”函数,但这是一项繁重的工作。在许多情况下,尽管存在您所询问的异常情况,但在任何地方都使用 UTF-8要容易得多,因为它倾向于 Just Work。特别是,只要您不必将字符串分开并处理其各个字符,或者使用 计算字符串的屏幕显示长度(以“字符”为单位)strlen,您就可以在任何地方使用纯 C 字符串,并让 UTF-8 序列的魔力处理您的用户碰巧输入的任何非 ASCII 字符。

于 2022-02-10T05:02:51.977 回答