はじめまして。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").
// -----------------------------------------
よろしくお願いします。
ユニバーサル文字セットに関して。
Re:ユニバーサル文字セットに関して。
#include <stdio.h> #include <locale.h> #include <tchar.h> #include <io.h> int _tmain(int argc, _TCHAR* argv[/url]) { TCHAR buf[256], dir[256], dum[256]; long hd; struct _tfinddata_t fd; FILE *fp; _tsetlocale(LC_ALL, _T("Japanese")); _tcscpy(dir, "C:\\temp"); // 親ディレクトリ指定。 _stprintf(buf, _T("%s\\*.*"), dir); // フォーマット指定。 if((hd = _tfindfirst(buf, &fd)) == -1L); // エラー。 else { do { if(fd.attrib & _A_SUBDIR); // サブディレクトリ else { // ファイル _stprintf(dum, _T("%s\\%s"), dir, fd.name); // フルパス取得。 if(fp = _tfopen(dum, _T("rb"))) { // ファイルオープン。 _tprintf(_T("I can open the file(\"%s\").\n"), dum); fclose(fp); } // オープン成功。 else { _tprintf(_T("I can not open the file(\"%s\").\n"), dum); // オープン失敗。(TT; } } } while (_tfindnext(hd, &fd) == 0); _findclose(hd); } return 0; }コンソールに表示されるファイル名は化けます。
Re:ユニバーサル文字セットに関して。
ISLe さま。
NIDA です。お礼が送れて申し訳ありません。
無事解決しました。
本当にありがとうございました。
一応修正したものを下記しておきます。
ユニバーサル文字をタイトルに含むファイルのパスを取得して、
.html ファイルに書き出し(そのファイルへのリンクを作成)。
リンクをクリックして、ユニバーサル文字をタイトルに含む
ファイル開くというものです。(ワンクッション入りますが...。)
問題のニョロ文字も、ブラウザでちゃんと表示されてリンクも
実行できました。
※ Google Chrome v6.04, IE v8.06, Fire Fox v3.6
今回、はじめて_tsetlocale()、_stprintf() などの関数を知りました。
今までは、wcstombs() に任せっぱなしだったので、勉強になりました。
本当にありがとうございました。
// =============================================================
> 1:
> 2: extern TCHAR *wheader;
> 3: extern TCHAR *wfooter;
> 4:
> 5: int _tmain(int argc, _TCHAR* argv[/url])
> 6: {
> 7: TCHAR buf[256], dir[256], dum[256];
> 8: char dum2[512];
> 9:
> 10: long hd;
> 11: struct _tfinddata_t fd;
> 12:
> 13: FILE *fp, *fpw;
> 14:
> 15: _tsetlocale(LC_ALL, _T("Japanese"));
> 16:
> 17: // ---------------------------------------------------
> 18: _tcscpy(dir, _T("C:\\temp")); // 親ディレクトリ指定。
> 19: _stprintf(buf, _T("%s\\*.*"), dir); // フォーマット指定。
> 20:
> 21: if(fpw = _tfopen(_T("C:\\temp\\res\\output.html"), _T("w, ccs=UTF-8"))){
> 22: // 書き込み用ファイル(.html)オープン。"UNICODE 形式"。
> 23:
> 24: _ftprintf(fpw, _T("%s"), wheader); // ヘッダー出力。HTML。
> 25:
> 26: // .........................................
> 27: if((hd = _tfindfirst(buf, &fd)) == -1L); // エラー。
> 28: else {
> 29: do {
> 30: if(fd.attrib & _A_SUBDIR); // サブディレクトリ
> 31: else { // ファイル
> 32: _stprintf(dum, _T("%s\\%s"), dir, fd.name); // フルパス取得。
> 33:
> 34: if(fp = _tfopen(dum, _T("rb"))) { // オープン成功。
> 35: fclose(fp); // クローズ。
> 36:
> 37: // --------------------- HTML 書き出し。
> 38: _ftprintf(fpw, _T("<a href=\"../"));
> 39: _ftprintf(fpw, _T("%s"), fd.name);
> 40: _ftprintf(fpw, _T("\">%s へのリンク。[/url]
\n"), fd.name);
> 41: // ---------------------
> 42: }
> 43: else { // オープン失敗。(TT;
> 44: _tprintf(_T("I can not open the file(\"%s\").\n"), dum);
> 45: }
> 46: }
> 47: } while (_tfindnext(hd, &fd) == 0);
> 48:
> 49: _findclose(hd);
> 50: }
> 51: // .........................................
> 52:
> 53: _ftprintf(fpw, _T("%s"), wfooter); // フッター出力。HTML。
> 54: fclose(fpw);
> 55: }
> 56: else {
> 57: // error.
> 58: }
> 59:
> 60: return 0;
> 61: }
> 62:
> 63: TCHAR *wheader = L"<html>\n"
> 64: L"<head>\n"
> 65: L"<title>ホームページ見本</title>\n"
> 66: L"</head>\n"
> 67: L"<body>\n"
> 68: L"<center> <h1>ホームページ見本</h1> </center>\n"
> 69: L"
\n"
> 70: L"
\n";
> 71:
> 72: TCHAR *wfooter = L"</body>\n"
> 73: L"</html> \n";
> 74:
// =============================================================
// =============================================================
// 実行結果。(output.html の中身。)
> 1:
> 2: <html>
> 3: <head>
> 4: <title>ホームページ見本</title>
> 5: </head>
> 6: <body>
> 7: <center> <h1>ホームページ見本</h1> </center>
> 8:
> 9:
> 10: [url]../【2D-CH@MPLE!】完璧ぐ?のね【踊ってみた】.mov[/url]
> 11: [url]../【おちゃめ機能】Ochame Kinou 吹っ切れた【おしゃれ関係】HD.mp4[/url]
> 12: </body>
> 13: </html>
// =============================================================
NIDA です。お礼が送れて申し訳ありません。
無事解決しました。
本当にありがとうございました。
一応修正したものを下記しておきます。
ユニバーサル文字をタイトルに含むファイルのパスを取得して、
.html ファイルに書き出し(そのファイルへのリンクを作成)。
リンクをクリックして、ユニバーサル文字をタイトルに含む
ファイル開くというものです。(ワンクッション入りますが...。)
問題のニョロ文字も、ブラウザでちゃんと表示されてリンクも
実行できました。
※ Google Chrome v6.04, IE v8.06, Fire Fox v3.6
今回、はじめて_tsetlocale()、_stprintf() などの関数を知りました。
今までは、wcstombs() に任せっぱなしだったので、勉強になりました。
本当にありがとうございました。
// =============================================================
> 1:
> 2: extern TCHAR *wheader;
> 3: extern TCHAR *wfooter;
> 4:
> 5: int _tmain(int argc, _TCHAR* argv[/url])
> 6: {
> 7: TCHAR buf[256], dir[256], dum[256];
> 8: char dum2[512];
> 9:
> 10: long hd;
> 11: struct _tfinddata_t fd;
> 12:
> 13: FILE *fp, *fpw;
> 14:
> 15: _tsetlocale(LC_ALL, _T("Japanese"));
> 16:
> 17: // ---------------------------------------------------
> 18: _tcscpy(dir, _T("C:\\temp")); // 親ディレクトリ指定。
> 19: _stprintf(buf, _T("%s\\*.*"), dir); // フォーマット指定。
> 20:
> 21: if(fpw = _tfopen(_T("C:\\temp\\res\\output.html"), _T("w, ccs=UTF-8"))){
> 22: // 書き込み用ファイル(.html)オープン。"UNICODE 形式"。
> 23:
> 24: _ftprintf(fpw, _T("%s"), wheader); // ヘッダー出力。HTML。
> 25:
> 26: // .........................................
> 27: if((hd = _tfindfirst(buf, &fd)) == -1L); // エラー。
> 28: else {
> 29: do {
> 30: if(fd.attrib & _A_SUBDIR); // サブディレクトリ
> 31: else { // ファイル
> 32: _stprintf(dum, _T("%s\\%s"), dir, fd.name); // フルパス取得。
> 33:
> 34: if(fp = _tfopen(dum, _T("rb"))) { // オープン成功。
> 35: fclose(fp); // クローズ。
> 36:
> 37: // --------------------- HTML 書き出し。
> 38: _ftprintf(fpw, _T("<a href=\"../"));
> 39: _ftprintf(fpw, _T("%s"), fd.name);
> 40: _ftprintf(fpw, _T("\">%s へのリンク。[/url]
\n"), fd.name);
> 41: // ---------------------
> 42: }
> 43: else { // オープン失敗。(TT;
> 44: _tprintf(_T("I can not open the file(\"%s\").\n"), dum);
> 45: }
> 46: }
> 47: } while (_tfindnext(hd, &fd) == 0);
> 48:
> 49: _findclose(hd);
> 50: }
> 51: // .........................................
> 52:
> 53: _ftprintf(fpw, _T("%s"), wfooter); // フッター出力。HTML。
> 54: fclose(fpw);
> 55: }
> 56: else {
> 57: // error.
> 58: }
> 59:
> 60: return 0;
> 61: }
> 62:
> 63: TCHAR *wheader = L"<html>\n"
> 64: L"<head>\n"
> 65: L"<title>ホームページ見本</title>\n"
> 66: L"</head>\n"
> 67: L"<body>\n"
> 68: L"<center> <h1>ホームページ見本</h1> </center>\n"
> 69: L"
\n"
> 70: L"
\n";
> 71:
> 72: TCHAR *wfooter = L"</body>\n"
> 73: L"</html> \n";
> 74:
// =============================================================
// =============================================================
// 実行結果。(output.html の中身。)
> 1:
> 2: <html>
> 3: <head>
> 4: <title>ホームページ見本</title>
> 5: </head>
> 6: <body>
> 7: <center> <h1>ホームページ見本</h1> </center>
> 8:
> 9:
> 10: [url]../【2D-CH@MPLE!】完璧ぐ?のね【踊ってみた】.mov[/url]
> 11: [url]../【おちゃめ機能】Ochame Kinou 吹っ切れた【おしゃれ関係】HD.mp4[/url]
> 12: </body>
> 13: </html>
// =============================================================