짧은 답변
문제는에 dot.exe있습니다. GraphViz는 Linux에서 유니 코드 경로가있는 파일을 열 수 있지만 Visual Studio 2005로 컴파일 된 경우가 아니면 Windows에서는 불가능합니다.
연구
코드 페이지가 850, Vim 인코딩으로 설정 되어 UTF-8있습니다.

정확히 같은 오류는 없지만 dot.exe잘못된 인수를받는 것으로 보입니다. 같은 파일 이름을 다른 프로그램으로 전달하려고했습니다.

그리고 그것은 제대로 작동했습니다. 직접 실행 dot.exe하고 type직접 실행 cmd.exe하면 동일한 결과를 얻을 수 있으므로 Windows 콘솔이나 Vim 모두 문제가되지 않습니다. 그 오류를 일으킬 수있는 다음 것은 그 dot.exe자체였습니다. 내 콘솔 코드조차도 유니 코드 코딩 인수를 올바르게 처리하는 방법을 모른다는 의혹이 있었다.
https://ss64.com/nt/chcp.html
완전한 유니 코드 지원이 필요한 경우 PowerShell을 사용하십시오. CMD 셸에서 유니 코드에 대한 지원은 여전히 매우 제한적이며 파이핑, 리디렉션 및 대부분의 명령은 여전히 ANSI 전용입니다. 작동하는 유일한 명령은 DIR, FOR / F 및 TYPE이며, 이는 파일 및 파일 이름을 읽고 쓸 수 있지만 (UTF-16LE / BOM) 다른 것은 아닙니다.
GraphViz에서 유니 코드를 지원하는 경우 웹을 검색하여 유니 코드 파일을 지원 하지만 파일 이름의 유니 코드 지원 은 지원하지 않는 것으로 나타났습니다 . GraphViz 버그 트래커에 대한 보고서 나 포럼에서 유니 코드라는 이름의 파일을 읽는 데 관심이있는 사람에 대한 게시물을 찾지 못했습니다. 그래서 나는 그것을 소스에서 찾았습니다. 여기에 무엇 dot.exe진입 점의 모양이 좋아 :
graphviz-2.40.1\cmd\dot\dot.c
int main(int argc, char **argv)
{
. . .
/* --------------------> ARGS ARE BEING PASSED HERE */
gvParseArgs(Gvc, argc, argv);
. . .
argv토끼 구멍을 따라 아래로 :graphviz-2.40.1\lib\common\args.c
int gvParseArgs(GVC_t *gvc, int argc, char** argv)
{
int rv;
if ((argc = neato_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = fdp_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = memtest_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = config_extra_args(gvc, argc, argv)) < 0) return (1-argc);
/* --------------------> HERE GO ALL NON-FLAG ARTUMENTS */
if ((rv = dotneato_args_initialize(gvc, argc, argv))) return rv;
if (Verbose) gvplugin_write_status(gvc);
return 0;
}
graphviz-2.40.1\lib\common\input.c
int dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
{
for (i = 1; i < argc; i++) {
if (argv[i] && argv[i][0] == '-') {
. . .
/* --------------------> JUST CASUALLY COPYING CHAR POINTERS */
} else if (argv[i])
gvc->input_filenames[nfiles++] = argv[i];
}
그리고 결말 graphviz-2.40.1\lib\common\input.c
graph_t *gvNextInputGraph(GVC_t *gvc)
{
. . . .
/* --------------------> OPENING THE FILES FOR READ WITH FOPEN */
while ((fn = gvc->input_filenames[fidx++]) && !(fp = fopen(fn, "r"))) {
. . .
}
MDSN은 다음과 같이 말합니다.
하면 fopen 기능은 파일 이름에 의해 지정된 파일을 엽니 다. _wfopen 은 와이드 문자 버전의 fopen입니다 . _wfopen에 대한 인수 는 와이드 문자 스트링입니다. _wfopen 과 fopen은 다르게 동작합니다. 단순히 _wfopen 을 사용하더라도 파일 스트림에 사용 된 코딩 된 문자 세트에는 영향을 미치지 않습니다.
Visual C ++ 2005에서 fopen은 유니 코드 파일 스트림을 지원합니다.
슬프게도, 유일한 옵션은 파일 이름을 바꾸는 것입니다.
cmd는 파일 이름을 허용하지만 Unix와 같은 환경을 설치하는 것이 내가 선호하는 처리 방법입니다.