ユニバーサル文字セットに関して。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NIDA

ユニバーサル文字セットに関して。

#1

投稿記事 by NIDA » 14年前

はじめまして。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").
// -----------------------------------------

よろしくお願いします。

ISLe

Re:ユニバーサル文字セットに関して。

#2

投稿記事 by ISLe » 14年前

#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;
}
コンソールに表示されるファイル名は化けます。

NIDA

Re:ユニバーサル文字セットに関して。

#3

投稿記事 by NIDA » 14年前

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>
// =============================================================

閉鎖

“C言語何でも質問掲示板” へ戻る