Scanf和printf返回不同的unicode字符

时间:2016-12-13 21:27:54

标签: c string unicode utf-8 console

我需要制作一个读写希腊字母的程序。由于希腊语不是ASCII,我将控制台语言环境设置为UTF-8。我设法在这个多字节的混乱中使一些字符串工作,直到我到达我需要用户输入的部分

所以,生病只发布有问题的部分

while(1) {
    char inputc[50]; 
    memset(inputc,'\0',50);
    scanf("%s",inputc)
    printf("%s",inputc);
}

对于任何希腊字符,这将打印与输入不同的内容。另外,如果我为每个元素printf("%d",inputc[i]);获取int值(对于希腊字母说是负数),我得到的值与从文字中读取相同字符的值不同。

1 个答案:

答案 0 :(得分:1)

  

使用的命令是SetConsoleOutputCP(CP_UTF8);

只影响stdout(printf)。要设置stdin(scanf),您还需要SetConsoleCP(CP_UTF8)。如果您设置了一个而不是另一个,则输入和输出字符自然会有所不同。

但是,请注意,当设置为代码页65001 / CP_UTF8时,Windows控制台中存在严重错误(或者通常是任何没有特殊支持的多字节代码页,即那些不是旧版区域设置的代码页 - 默认代码页)。 Windows在此状态下报告字节数不正确,导致打印调用错误并重复输出,并扫描挂起的调用。这通常不是让Windows程序与Unicode通信的可行方法。