【问题标题】:Reading a UTF-16 CSV file by char按字符读取 UTF-16 CSV 文件
【发布时间】:2012-08-20 23:27:49
【问题描述】:

目前我正在尝试逐字符读取 UTF-16 编码的 CSV 文件,并将每个字符转换为 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 并从那里转换它?我不知道我会怎么做,任何帮助都会很棒。

【问题讨论】:

  • CSV 文件是否只包含 ASCII 中存在的字符?
  • 是的,这是很好的部分,它只是 UTF-16 编码,因为生成它的软件 (WonderWare)
  • 您应该只能读取每个第二个字节以获得所需的结果。另一个字节应始终为零。
  • 每第二个字节 hm?那么将它写回utf-16(假设所使用的字符仍然都是ASCII字符)我会让每个第一个字节为空?
  • 好吧,老实说,除非他真的知道自己在做什么,否则不应该拥有 UTF-16 CSV 文件。

标签: c csv ascii utf-16


【解决方案1】:

您应该使用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;
  }
}

【讨论】:

  • @oldrinb 我需要设置语言环境吗?
  • @user877329 确保fgetwc 做我们想做的事,是的
【解决方案2】:

感谢我最初问题下的 cmets,这是我的解决方案。由于 CSV 文件中的每个字符都是有效的 ascii,因此解决方案很简单:

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;
}

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多