c - 如何修复语言环境?

标签 c locale

添加 ru_RU.CP1251 语言环境(在 debian 上取消注释 /etc/locale.gen 中的 ru_RU.CP1251 并运行 sudo locale-gen)和 使用 gcc -fexec-charset=cp1251 test.c 编译以下程序(输入文件为 UTF-8)。结果是空的。只是字母'я'是错误的。 其他字母确定为小写或大写即可。

#include <locale.h>
#include <ctype.h>
#include <stdio.h>
int main (void)
{
  setlocale(LC_ALL, "ru_RU.CP1251");
  char c = 'я';
  int i;
  char z;
  for (i = 7; i >= 0; i--) {
    z = 1 << i;
    if ((z & c) == z) printf("1"); else printf("0");
  }
  printf("\n");

  if (islower(c))
    printf("lowercase\n");
  if (isupper(c))
    printf("uppercase\n");
  return 0;
}

为什么 islower()isupper() 都不能处理字母 я

最佳答案

答案是 CP 1251 中该字符的小写版本的编码是十进制 255,而您的实现的 islower()isupper()不接受或返回该值(通常被解释为 EOF)。

您需要追踪运行时库的源代码以了解它的作用和原因。

解决方案是编写您自己的实现,或包装您拥有的实现。就个人而言,我从不直接使用这些函数,因为有很多陷阱。

关于c - 如何修复语言环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40298801/

相关文章:

c - C 中的 volatile 和变量修改

c - 将数组参数传递给函数

date - 从 AUT 获取日期?

c - 是否有提供优先队列的 C 库?

c - Lua - 将表获取到 C,更新它并将其上传回来

c++ - 以编程方式更改输入区域设置(键盘 - 左 shift+ alt + 1)键序列

postgresql - 所选的 LC_CTYPE 设置需要编码 "LATIN1"

javascript - "toLocaleString"在不同的浏览器上给出不同的输出

javascript - 使用用户从 Javascript 下拉列表中选择的值执行函数

c - 如果 linux 安装在 usb 上,如何在 Linux 中运行 c 代码