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.xml は UTF-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 など。