2016-11-22 5 views
1

こんにちは。C - wchar_tは不要な文字を表示します

英語以外の文字ファイルを含むフォルダを一覧表示しようとしています。 以下の関数は引数をとって、例えばC:\とし、その内部のファイルをリストします。しかし100%正しくはありません。トルコ文字の場合は、wchar_tタイプを使用していたにもかかわらず、いくつかのシンボルを出力します。

void listFolder(const wchar_t* path){ 
DIR *dir; 
struct _wdirent *dp; 
wchar_t * file_name; 
wchar_t fullpath[MAX_PATH]; 
dir = _wopendir(path); 

while ((dp=_wreaddir(dir)) != NULL) { 
    //printf("[i]debug: \t%s\n", dp->d_name); 
    if (!wcscmp(dp->d_name, L".") || !wcscmp(dp->d_name, L"..")){ 
     // do nothing 
    } 
    else { 
     file_name = dp->d_name; // use it 
     wprintf(L"[*]file_name: \t\"%ls\"\n",file_name); 
    } 
} 
_wclosedir(dir); 

} 

私は現在、コードブロック16.01

でのWindows 7のx64を使用しています奇妙な部分は、ある同じ機能は、コードブロックでのUbuntu 16.04の下で完全に正常に動作します。

+0

これはWindowsコンソールの正常な動作です、あなたは文字をサポートします1にコードページを変更する必要がhttp://stackoverflow.com/questions/15827607/writeconsolew-wprintf-and-unicode見ます印刷したい – Richard

答えて

0

DIR *dirは、Unicodeではなく、ANSI用です。代わりに_WDIRを使用してください。

Windowsでは、Unicodeの印刷が制限されています。 MinGWでは、Unicodeの印刷にWriteConsoleWを使用します。例:

#include <stdio.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <windows.h> 

void myprint(const wchar_t* str) 
{ 
    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, wcslen(str), NULL, NULL); 
} 

void listFolder(const wchar_t* path) 
{ 
    _WDIR *dir = _wopendir(path); 
    if (!dir) return; 

    struct _wdirent *dp; 
    while ((dp=_wreaddir(dir)) != NULL) 
    { 
     if (wcscmp(dp->d_name, L".") == 0 || wcscmp(dp->d_name, L"..") == 0) 
      continue; 
     myprint(dp->d_name); 
     wprintf(L"\n"); 
    } 
    _wclosedir(dir); 
} 
関連する問題