2014-01-06 51 views
1

源:如何确定linux下scanf的编码?

#include <stdio.h> 
int main() 
{ 
    char buff[100] = {0}; 
    char ch; 
    int index = 0; 
    scanf("%s", buff); 
    ch = buff[index]; 
    while (ch) { 
     printf("%2x", ch); 
     ch = buff[index++]; 
    } 
    return 0; 
} 
  1. 集区域设置为zh_CN.utf8,输入 '我',输出 '\ XE6 \ X88 \ X91'(我的UTF8编码)
  2. 集区域设置zh_CN.gb108030,输入'我',输出没有改变。

问题是为什么编码没有改变?我认为它应该是'\ xce \ xd2'(我的gb18030编码)。

或者gnome-terminal(base shell)将每一个输入,不管使用什么语言环境,都转换为utf8编码?

谢谢。

+0

区域设置的更改不会立即生效。你是否重新登录或做过其他事情,比如重新启动IME(输入法编辑器)守护进程?另外,你使用什么IME? – starrify

+0

尝试并在导出LOCALE后重新启动ime,这是fcitx,但没有任何更改。 – Jichao

回答

0

通常,您的输入系统(在您的情况下,gnome-terminal)以特定字符编码(语言环境的第二部分)生成输入字符。通常通过其他方法(命令行选项,菜单选项,硬编码到程序等)来设置,而不是通过环境变量来设置。因此,locale环境变量中的字符编码通常有一个理想值用于输入系统生成字符的值。您可以或多或少自由地更改语言(语言环境的第一部分),但不能更改字符编码。