c - wprintf 不打印特殊字符,当 1 为 Fund 时,fgetws 返回 NULL

标签 c special-characters

我对 fgetwswprintf 有疑问。

当之前打开的文件中有特殊字符时,返回

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 系统上,这使用 LANGLC_* 环境变量来确定首选区域设置。只要您尝试使用的字符存在于用户的区域设置中,您的 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/

相关文章:

c - 互斥量由一个线程捕获并由另一个 CMSIS 和 FreeRTOS STM 板释放

c - 在 GCC 4.4 中,使用 long double 传递 union 的 ABI 发生了变化

java - 非法字符实体 : expansion character (code 0xe

c# - 用制表符分隔字符串

google-chrome - 显示特殊的非英文字符

c - 在 K&R 1-9 中手动循环复制 getchar()

Arduino 草图的倒计时器

c++ - 如何在c/c++中将字符串中的字母按字母顺序排序?

iphone - 如何从 SQLite 中正确读取和打印重音字符?

Python 解析 sys.argv 中的 $