짧은 답변
문제는에 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와 같은 환경을 설치하는 것이 내가 선호하는 처리 방법입니다.