【问题标题】:Reading Files in from UTF8从 UTF8 读取文件
【发布时间】:2017-01-31 13:16:15
【问题描述】:

我正在尝试读取包含 UTF-8 格式字符的文件。

    FILE * f = fopen(argv[1], "r");
    if(f == NULL){
            printf("cannot open %s\n", argv[1]);
            exit(-1);
        }
    unsigned int c = getc();
    while(c != EOF){
        printf("%d\n", c);  // UB
        c = getchar();

    }

如何读取文件以使它们以位表示?例如,它看起来像:0xA3。 现在它正在打印实际的整数。 基本上,我如何以位格式读取字符?

【问题讨论】:

  • 由于您编写代码的方式,它正在打印整数。你能解释更多你想要做什么吗?你知道 UTF-8 是一种多字节编码吗?
  • printf("%d\n", c) 更改为printf("%#x\n", c)
  • 现代二进制计算机中的所有数据都是二进制形式。这只是您选择如何显示该数据的问题。在您的情况下,我建议您阅读更多关于printf 及其不同格式的信息。此外,几乎 any beginners book 或教程会告诉您如何以十六进制表示法打印任何整数。
  • @RetiredNinja 基本上我的目标是将 UTF8 解码为 utf32 ...
  • x 而不是 printf 中的 d

标签: c utf-8


【解决方案1】:

utf-8 文件读取示例.....

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

int main(int argc, char *argv[]){
        setlocale(LC_ALL, "en_US.UTF-8");
        FILE * f = fopen(argv[1], "r");
        if(f == NULL){
                printf("cannot open %s\n", argv[1]);
                exit(-1);
        }
        wchar_t wc;
        while((wc=fgetwc(f))!=WEOF){
                //wprintf(L"%lc", wc);
                // for output as hex of uthf-8 characters
                wprintf(L"0X%X,",(wint_t) wc);
        }
        wprintf(L"\n");
        fclose(f);
        return 0;
}

【讨论】:

  • 这不是便携式的。
  • 我认为这里使用的所有函数都可以在标准 c 中使用。我没有得到它不便携的东西?你能点亮我们吗?
  • 语言环境名称不可移植。不保证实现支持 utf-8 语言环境。
  • 代码应该检查setlocale(LC_ALL, "en_US.UTF-8") 的结果是否成功,并处理它以便移植。
  • 顺便说一句:OP想要像0xA3这样的输出,这肯定不会来自wprintf(L"%lc", wc)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多