我对 fgetws
和 wprintf
有疑问。
NULL
。我使用 fgets
时没有这个问题。
我尝试使用setlocale
,如下推荐:fgetws fails to get the exact wide char string from FILE*
但这并没有改变任何东西。
此外, wprintf(L"éé");
打印 ??
(我对 printf
也没有这个问题)终端(在 Ubuntu 12 上),可以采取什么措施来避免这种情况?
编辑:正如评论中所要求的,这里是非常简单的代码:
# include "sys.h"
#define MAX_LINE_LENGTH 1024
int main (void){
FILE *File = fopen("D.txt", "r");
wchar_t line[MAX_LINE_LENGTH];
while (fgetws(line, MAX_LINE_LENGTH, File))
wprintf(L"%S", line);
fclose(File);
return 0;
}
最佳答案
默认情况下,当程序启动时,它在 C 语言环境中运行,不保证支持除翻译 C 程序所需的字符之外的任何字符。 (它可以包含更多的实现细节,但您不能依赖于此。)为了使用 wchar_t 存储其他字符并使用宽字符转换函数或宽 stdio 函数处理它们,您需要设置支持这些字符的区域设置。
可用的区域设置及其命名方式因系统而异,因此您不应尝试按名称设置区域设置。相反,将 ""
传递给 setlocale
以请求用户或系统的“默认”区域设置。在类 POSIX 系统上,这使用 LANG
和 LC_*
环境变量来确定首选区域设置。只要您尝试使用的字符存在于用户的区域设置中,您的 wprintf
就应该可以工作。
对 setlocale
的调用应如下所示:
setlocale(LC_CTYPE, "");
或者:
setlocale(LC_ALL, "");
前者仅将区域设置应用于字符编码/字符类型函数(处理 wchar_t
的东西)。后者还导致区域设置被设置并影响许多其他事情,例如消息语言、数字和时间的格式……
需要注意的一个细节是,宽 stdio
函数绑定(bind)流“变为面向宽”时正在使用的语言环境的字符编码,即在执行的第一个宽操作时它。所以在使用wprintf
之前需要先调用setlocale
。
关于c - wprintf 不打印特殊字符,当 1 为 Fund 时,fgetws 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106764/