通过char读取UTF-16 CSV文件

时间:2012-08-25 21:06:08

标签: c csv ascii utf-16

目前我正在尝试通过char读取UTF-16编码的CSV文件char,并将每个char转换为ascii,以便我可以处理它。我后来计划将处理后的数据更改回UTF-16,但现在除此之外。

我知道我完全错了,因为我之前从未尝试过这样的事情:

int main(void)
{
    FILE *fp;
    int ch;
    if(!(fp = fopen("x.csv", "r"))) return 1;
    while(ch != EOF)
    {
        ch = fgetc(fp);
                ch = (wchar_t) ch;
                ch = (char) ch;
        printf("%c", ch);
    }
    fclose(fp);
    return 0;
}
好心思考,我希望由于某种原因魔术的作用,但事实并非如此。如何读取UTF-16 CSV文件并将其转换为ascii?我猜是因为每个utf-16字符都是两个字节(我认为?)我将不得不一次从文件读取两个字节到一些我不确定的数据类型的变量。然后我想我将不得不检查这个变量的位,以确保它是有效的ascii并从那里转换它?我不知道如何做到这一点,任何帮助都会很棒。

2 个答案:

答案 0 :(得分:4)

您应该使用fgetwc。以下代码应该在byte-order mark和名为en_US.UTF-16的可用区域设置的情况下工作。

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

main() {
  setlocale(LC_ALL, "en_US.UTF-16"); 

  FILE *fp = fopen("x.csv", "rb");
  if (fp) {
    int order = fgetc(fp) == 0xFE;
    order = fgetc(fp) == 0xFF;

    wint_t ch;
    while ((ch = fgetwc(fp)) != WEOF) {
      putchar(order ? ch >> 8 : ch);
    }
    putchar('\n');

    fclose(fp);
    return 0;
  } else {
    perror("opening x.csv");
    return 1;
  }
}

答案 1 :(得分:0)

这是我的解决方案,这要归功于我原来问题的评论。由于CSV文件中的每个字符都是有效的,因此解决方案很简单:

int main(void)
{
    FILE *fp;
    int ch, i = 1;
    if(!(fp = fopen("x.csv", "r"))) return 1;
    while(ch != EOF)
    {
        ch = fgetc(fp);
        if(i % 2) //ch is valid ascii
        i++;
    }
    fclose(fp);

    return 0;
}