ユニバーサル文字セットに関して。
Posted: 2010年10月18日(月) 09:20
はじめまして。NIDA といいます。
ユニバーサル文字セットに関して、質問させてください。
以前作成したプログラムの中に、ディスク上の動画ファイルの
パスをリストアップする処理があるのですが、ファイル名に
ユニバーサル文字が使用されているファイルがあり、取得した
パスを実行してもその動画ファイルが開けないという場面が
出てきました。
■ やりたいこと。
下記のニコニコ動画のタイトルと同じ名前のテキストファイルを
C:\temp(適当な場所)に配置したあと、C:\temp 直下のファイルの
リストを作成、各ファイルをオープン/クローズしたい。
※ タイトルもコピペしたかったのですが、化ける可能性があるので
URL を下記させていただきました。
# [nico]http://www.nicovideo.jp/watch/sm9635449[/nico]
※タイトルは、上のほうに記述されている "【2D-C" から、"踊って
みた】" までです。
■ 今回うまくいかないのは、上記で配置したテキストが "リストアップは
されるが、オープンできない"というものです。
ファイル名に問題があって、ニョロの部分が引っかかるようです。
上記のニョロの文字を使って、UNICODE テキストとして保存した
ファイルを VS2008 で開くと、下記のようなメッセージが表示されます。
> warning C4566: ユニバーサル文字名 '\u301C' によって表示されている文字は、
> 現在のコード ページ (932) で表示できません
ググッたところ、ユニバーサル文字とは
"これまでの文字コードとの互換性をあきらめた、新しい文字コードの形態です。
制御コード領域 (0x00~0x1F) をもフル活用しているので、Unicode
対応ソフトウェアでないと、テキストファイルをバイナリファイルと誤認します。 "
とありました。
対処方法を知っている方がいれば、教えていただけないでしょうか。
■ WinXP SP3, VS2008.
// -----------------------------------------
// trial.cpp
> 1: int _tmain(int argc, _TCHAR* argv[/url])
> 2: {
> 3:
> 4: char buf[256], dir[256], dum[256];
> 5: long hd;
> 6: _finddata_t fd;
> 7:
> 8: FILE *fp;
> 9:
> 10: strcpy(dir, "C:\\temp"); // 親ディレクトリ指定。
> 11: sprintf(buf, "%s\\*.*", dir); // フォーマット指定。
> 12:
> 13: if((hd = _findfirst(buf, &fd)) == -1L); // エラー。
> 14: else {
> 15: do {
> 16: if(fd.attrib & _A_SUBDIR); // サブディレクトリ
> 17: else { // ファイル
> 18:
> 19: sprintf(dum, "%s\\%s", dir, fd.name); // フルパス取得。
> 20:
> 21: if(fp = fopen(dum, "rb")){ // ファイルオープン。
> 22: printf("I can open the file(\"%s\").\n", dum);
> 23: fclose(fp);
> 24: } // オープン成功。
> 25: else {
> 26: printf("I can not open the file(\"%s\").\n", dum);
> 27: // オープン失敗。(TT;
> 28: }
> 29: }
> 30: }while (_findnext(hd, &fd) == 0);
> 31:
> 32: _findclose(hd);
> 33: }
> 34:
> 35: return 0;
> 36: }
// -----------------------------------------
// -----------------------------------------
// 実行結果。
> 1: C:\Project\Trial\Release>Trial.exe
> 2: I can open the file("C:\temp\dummy.txt").
> 3: I can not open the file("C:\temp\【2D-CH@MPLE!】完璧ぐ?のね【踊ってみた】.txt").
// -----------------------------------------
よろしくお願いします。
ユニバーサル文字セットに関して、質問させてください。
以前作成したプログラムの中に、ディスク上の動画ファイルの
パスをリストアップする処理があるのですが、ファイル名に
ユニバーサル文字が使用されているファイルがあり、取得した
パスを実行してもその動画ファイルが開けないという場面が
出てきました。
■ やりたいこと。
下記のニコニコ動画のタイトルと同じ名前のテキストファイルを
C:\temp(適当な場所)に配置したあと、C:\temp 直下のファイルの
リストを作成、各ファイルをオープン/クローズしたい。
※ タイトルもコピペしたかったのですが、化ける可能性があるので
URL を下記させていただきました。
# [nico]http://www.nicovideo.jp/watch/sm9635449[/nico]
※タイトルは、上のほうに記述されている "【2D-C" から、"踊って
みた】" までです。
■ 今回うまくいかないのは、上記で配置したテキストが "リストアップは
されるが、オープンできない"というものです。
ファイル名に問題があって、ニョロの部分が引っかかるようです。
上記のニョロの文字を使って、UNICODE テキストとして保存した
ファイルを VS2008 で開くと、下記のようなメッセージが表示されます。
> warning C4566: ユニバーサル文字名 '\u301C' によって表示されている文字は、
> 現在のコード ページ (932) で表示できません
ググッたところ、ユニバーサル文字とは
"これまでの文字コードとの互換性をあきらめた、新しい文字コードの形態です。
制御コード領域 (0x00~0x1F) をもフル活用しているので、Unicode
対応ソフトウェアでないと、テキストファイルをバイナリファイルと誤認します。 "
とありました。
対処方法を知っている方がいれば、教えていただけないでしょうか。
■ WinXP SP3, VS2008.
// -----------------------------------------
// trial.cpp
> 1: int _tmain(int argc, _TCHAR* argv[/url])
> 2: {
> 3:
> 4: char buf[256], dir[256], dum[256];
> 5: long hd;
> 6: _finddata_t fd;
> 7:
> 8: FILE *fp;
> 9:
> 10: strcpy(dir, "C:\\temp"); // 親ディレクトリ指定。
> 11: sprintf(buf, "%s\\*.*", dir); // フォーマット指定。
> 12:
> 13: if((hd = _findfirst(buf, &fd)) == -1L); // エラー。
> 14: else {
> 15: do {
> 16: if(fd.attrib & _A_SUBDIR); // サブディレクトリ
> 17: else { // ファイル
> 18:
> 19: sprintf(dum, "%s\\%s", dir, fd.name); // フルパス取得。
> 20:
> 21: if(fp = fopen(dum, "rb")){ // ファイルオープン。
> 22: printf("I can open the file(\"%s\").\n", dum);
> 23: fclose(fp);
> 24: } // オープン成功。
> 25: else {
> 26: printf("I can not open the file(\"%s\").\n", dum);
> 27: // オープン失敗。(TT;
> 28: }
> 29: }
> 30: }while (_findnext(hd, &fd) == 0);
> 31:
> 32: _findclose(hd);
> 33: }
> 34:
> 35: return 0;
> 36: }
// -----------------------------------------
// -----------------------------------------
// 実行結果。
> 1: C:\Project\Trial\Release>Trial.exe
> 2: I can open the file("C:\temp\dummy.txt").
> 3: I can not open the file("C:\temp\【2D-CH@MPLE!】完璧ぐ?のね【踊ってみた】.txt").
// -----------------------------------------
よろしくお願いします。