Windows控制台C语言土耳其语字符输入异常求助
解决Windows下C语言控制台输入土耳其语字符乱码问题
这个问题我之前也碰到过,本质是Windows控制台的默认编码和C标准库通过setlocale设置的编码不匹配导致的,咱们一步步来解决:
问题根源
Windows控制台默认使用OEM编码(土耳其语对应的是CP857),而setlocale(LC_ALL, "Turkish")会把程序的locale设置为ANSI编码(土耳其语对应CP1254)。这两种编码对特殊字符的字节映射完全不同:
- 输出正常是因为
printf会把ANSI编码的字符输出到控制台,控制台会自动将其转换为OEM编码显示; - 输入乱码是因为
scanf用ANSI编码去解析控制台输入的OEM编码字符,自然就出现了§ ? Y ┼这类乱码。
解决方案
方案1:使用宽字符函数(推荐,更通用)
宽字符(wchar_t)基于Unicode,能统一处理各类语言字符,避免编码匹配问题。直接改用wscanf和wprintf即可:
#include <stdio.h> #include <wchar.h> #include <locale.h> int main() { // 设置土耳其语locale setlocale(LC_ALL, "Turkish"); wchar_t chars[4]; // 用宽字符格式符%lc读取输入 wscanf(L"%lc %lc %lc %lc", &chars[0], &chars[1], &chars[2], &chars[3]); // 用宽字符输出 wprintf(L"%lc %lc %lc %lc\n", chars[0], chars[1], chars[2], chars[3]); return 0; }
方案2:统一控制台和程序的编码为UTF-8
通过Windows API强制将控制台的输入输出编码设置为UTF-8,这样用普通的多字节函数也能正常处理:
#include <stdio.h> #include <locale.h> #include <windows.h> int main() { // 设置控制台输入输出编码为UTF-8 SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); // 设置locale为UTF-8(比"Turkish"更通用,支持多语言) setlocale(LC_ALL, ".UTF-8"); char chars[4]; scanf("%c %c %c %c", &chars[0], &chars[1], &chars[2], &chars[3]); printf("%c %c %c %c\n", chars[0], chars[1], chars[2], chars[3]); return 0; }
方案3:手动转换编码(不推荐,较繁琐)
如果你一定要用多字节函数且不修改控制台编码,可以通过MultiByteToWideChar和WideCharToMultiByte手动在OEM和ANSI编码间转换,但这种方式代码冗余,不如前两种方案简洁。
内容的提问来源于stack exchange,提问作者First Code
相关产品推荐
相关产品推荐

