1

現在、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文字は2バイトであるため(私は思いますか?)、ファイルから一度に2バイトを読み取って、不明なデータ型の変数に変換する必要があります。次に、この変数のビットをチェックして、有効なASCIIであることを確認し、そこから変換する必要があると思いますか?私はこれをどのように行うのかわかりませんが、どんな助けも素晴らしいでしょう。

4

2 に答える 2

4

を使用する必要がありますfgetwc。以下のコードは、バイト順マークと、という名前の使用可能なロケールが存在する場合に機能するはず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;
  }
}
于 2012-08-25T22:39:00.367 に答える
0

これは私の元の質問の下のコメントのおかげで私の解決策です。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;
}
于 2012-08-25T21:29:25.337 に答える