คำตอบสั้น ๆ
dot.exe
ปัญหาอยู่ใน GraphViz สามารถเปิดไฟล์ที่มีเส้นทาง Unicode ใน Linux แต่ไม่ใช่ Windows ยกเว้นว่า (อาจจะ) หากคอมไพล์ด้วย Visual Studio 2005
วิจัย
หน้ารหัสถูกตั้งค่า850
, UTF-8
กลุ่มการเข้ารหัสเพื่อ
มันไม่ได้ให้ข้อผิดพลาดเหมือนกัน แต่dot.exe
ดูเหมือนว่าจะได้รับข้อโต้แย้งที่ผิด ฉันพยายามส่งชื่อไฟล์เดียวกันไปยังโปรแกรมอื่น
และมันใช้งานได้ดี การดำเนินการทั้งสองอย่างdot.exe
และtype
โดยตรงcmd.exe
จะให้ผลลัพธ์เดียวกันดังนั้น Windows Console และ Vim จึงไม่เป็นปัญหา สิ่งต่อไปที่อาจทำให้เกิดข้อผิดพลาดนั้นdot.exe
เอง ความสงสัยของฉันคือว่ามันไม่ทราบวิธีจัดการกับข้อโต้แย้งที่เข้ารหัสแบบ Unicode อย่างถูกต้องเนื่องจากไม่ใช่คำสั่งคอนโซลทั้งหมดที่ทำได้:
https://ss64.com/nt/chcp.html
หากคุณต้องการการสนับสนุน Unicode แบบสมบูรณ์ให้ใช้ PowerShell ยังคงมีการสนับสนุนที่ จำกัด มากสำหรับ Unicode ในเชลล์ CMD, ไพพ์, การเปลี่ยนเส้นทางและคำสั่งส่วนใหญ่ยังคงเป็น ANSI เท่านั้น คำสั่งเดียวที่ใช้งานได้คือ DIR, FOR / F และ TYPE ทำให้สามารถอ่านและเขียนไฟล์และชื่อไฟล์ (UTF-16LE / BOM) แต่ไม่มาก
ฉันค้นหาบนเว็บหากมีการรองรับ Unicode ใน GraphViz และพบว่ามันรองรับไฟล์ Unicode แต่ไม่มีอะไรเกี่ยวกับการสนับสนุน Unicode สำหรับชื่อไฟล์ ฉันไม่พบรายงานใด ๆ ในเครื่องมือติดตามบั๊กของ GraphViz หรือโพสต์บนฟอรัมเกี่ยวกับคนอื่นที่สนใจอ่านไฟล์ Unicode ชื่อ ดังนั้นฉันจึงค้นหามันในแหล่งที่มา นี่คือสิ่งที่เป็น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ไม่มีผลกับชุดอักขระที่ใช้รหัสในไฟล์สตรีม
ใน c ++ Visual 2005 fopen รองรับกระแสไฟล์ Unicode
น่าเสียดายตัวเลือกเดียวที่มีคือการเปลี่ยนชื่อไฟล์
cmd
ยอมรับชื่อไฟล์ แต่การได้รับสภาพแวดล้อมที่คล้าย Unix จะเป็นการจัดการที่ฉันต้องการ