utf8 に変換すればいいじゃん。

えー,落ちからいってみました。


指定した日本語を,テキストファイルから抽出する方法を考えていて,
ま,とりあえず,でけたけど,タイトルのような落ちです。

対象とするテキストファイル,ソースコード文字コードは,
別に,sjis でも,euc-jp でも,utf-8 でもいいはず。

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

#define BUFSIZE 1024


int main(int argc, char **argv)
{
  wchar_t buf[BUFSIZE], *p = NULL, needle[BUFSIZE];
  char *str = "あたり", *filename = "wchar.txt", *locale = NULL;
  FILE *fp;

  if ((fp = fopen("wchar.txt", "r")) == NULL) {
    fprintf(stderr, "can't open file %s\n", filename);
    exit(1);
  }
  locale = setlocale(LC_ALL, ""); /* 環境変数を見て LC_なんちゃらを決めてくれるそうです */
  if (!locale) {
    fprintf(stderr, "setlocale not honored\n");
    exit(2);
  }
  printf("%s\n", locale);

  if (mbstowcs(needle, str, BUFSIZE) == -1) {
    fprintf(stderr, "mbstowcs() failed with %s\n", str);
    exit(3);
  }
  while (fgetws(buf, sizeof(buf) / sizeof(buf[0]), fp) != NULL) {
    p = wcsstr(buf, needle);
    if (p) {
      wprintf(L"%s\n", p);
    }
  }
  fclose(fp);
  return 0;
}
# cygwin の gblic には,fgetws() とかはいっていなので,リンクでけまへん。
# だもんで,mingw を使います。
$ gcc -Wall -o test_widechar test_widechar.c -mno-cygwin -g

$ cat wchar.txt
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
はずれ
あたり
はずれ
はずれ
はずれ
はずれ

$ ./test_widechar
Japanese_Japan.932
あたり

最後に2回,改行されているあたりがなんとも。。。


でね,はてなダイアリーの export.xmlUTF-8 なので,
strstr()やら,fgets()やらが,そのままつかえるんじゃね?
っていう落ちです。
てか,いいんだよね? それで。
1バイトずつみていっても,へんなところで,一致したりしないよね?
けつの1バイトが,0x30で終わるのが,「P(全角のP)」で,0xFF30。
漢字の「一」が,0x4E00。
つまり,「P一」が,FF30 4E00。
で,0x304E にあたるのが,ひらがなの「ぎ」。
1バイトずつ見ていったら,一致しちゃう?
ちょっとためしたところ,一致しないようだし,
od なり,gdb で見ても,「ぎ」の文字コードが違うし,「P」も「一」も違う。
うーん,なんか間違えているんだろうけど,どこかわからん。
エンディアンの問題だとしても,ひっくりかえして眺めたらわかるので,
それも違うし。


奥が深いぜ,マルチバイト文字。
だから,米帝の後手後手にまわるんだよなぁ。
と,自分がわからんからと,愚痴をはくあたりに人間の小ささが垣間見えたような気がします。
今日は,とっても眠いので,明日にします。


だれかわかる人,ヒントだけでも教えてくださいませ。


さて,話を戻してます。
上記のコードを試したところ,きちんと使えているようです。
あとは,文字列処理だけか。
XMLParser を使ってみたい気もするが,今回は,要求されていることが,
ちと違う気がするので,遠慮しときます。


参考:
コード表の,Japanese-specific の Hiragana,Katakana,Halfwidth-katakana (半角カタカナって英語でこういうのね!!),
それから,East Asian Scripts の Unified CJK Ideographs など。