首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按字符读取UTF-16 CSV文件

按字符读取UTF-16 CSV文件
EN

Stack Overflow用户
提问于 2012-08-26 05:06:08
回答 2查看 1.9K关注 0票数 1

目前,我正在尝试逐个读取UTF-16编码的CSV文件,并将每个字符转换为ascii,这样我就可以处理它。我稍后计划将我处理过的数据改回UTF-16,但这不是现在的重点。

我立刻知道我这样做是完全错误的,因为我以前从来没有尝试过这样的事情:

代码语言:javascript
复制
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,并从那里转换它?我不知道我会怎么做,但任何帮助都是很好的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-26 06:39:00

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

代码语言:javascript
复制
#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;
  }
}
票数 4
EN

Stack Overflow用户

发布于 2012-08-26 05:29:25

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

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12125659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档