2016-11-22 9 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); 

} 

나는 현재 CodeBlocks 16.01

와 윈도우 7의 x64를 사용하고 이상한 부분입니다 같은 기능이 CodeBlocks와 우분투 16.04에서 완벽하게 작동합니다.

+0

, 문자를 지원하는 당신은 하나에 코드 페이지를 변경해야 http://stackoverflow.com/questions/15827607/writeconsolew-wprintf-and-unicode를 참조하면 인쇄하고 싶다. – Richard

답변

0

DIR *dir은 유니 코드가 아닌 ANSI 용입니다. 대신 _WDIR을 사용하십시오.

Windows에서는 유니 코드 인쇄가 제한적으로 지원됩니다. MinGW에서는 유니 코드 인쇄에 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); 
}