当前位置:  开发笔记 > 开发工具 > 正文

Emacs,xterm,mousepad,C,Unicode和UTF-8:试图弄清楚这一切

如何解决《Emacs,xterm,mousepad,C,Unicode和UTF-8:试图弄清楚这一切》经验,为你挑选了1个好方法。

免责声明:我对下面的所有文本表示道歉(对于一个简单的问题),但我真诚地认为每一点信息都与这个问题有关.我很乐意另外学习.我只能希望,如果成功,问题和答案可能会帮助其他人疯狂.开始.

我已经阅读了所有通常备受推崇的关于utf8的网站,特别是这个非常适合我的目的,但我也读过经典,就像SO中其他类似问题中提到的那样.但是,我仍然缺乏如何在虚拟实验室中集成它的知识.我用Emacs

;; Internationalization
(prefer-coding-system 'utf-8)
(setq locale-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)

在我的.emacs中,xterm以

 LC_CTYPE=en_US.UTF-8 xterm -geometry 91x58\
-fn '-Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO10646-1'

我的语言环境如下:

LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

我的问题如下(一些答案可能是应用程序的预期行为,但我仍然需要理解它,所以请耐心等待):

假设以下C程序:

#include 

int main(void) {
  int c;
  while((c=getc(stdin))!=EOF) {
    if(c!='\n') {
      printf("Character: %c, Integer: %d\n", c, c);
    }
  }
  return 0;
}

如果我在我的xterm中运行它,我得到:

€
Character: ? Integer: 226
Character: ?, Integer: 130
Character: ?, Integer: 172

(以防万一我得到的字符是黑色圆圈内的白色问号).int是编码€所需的3个字节的十进制表示,但我不确定为什么xterm不能正确显示它们.

相反,Mousepad,例如,打印

Character: â, Integer: 226
Character: ,, Integer: 130 (a comma, standing forU+0082 , why?!)
Character: ¬, Integer: 172

同时,Emacs显示

Character: \342, Integer: 226
Character: \202, Integer: 130
Character: \254, Integer: 172

问题:我可以问的最普遍的问题是:如何让一切都打印出相同的字符?但我确信会有后续行动.

再次感谢,并为所有文本道歉.



1> DaveR..:

好的,所以你的问题是混合了老式的C库调用(getc,printf%c)和UTF-8.你的代码正确地读取组成'€'的三个字节 - 226,130和172作为十进制 - 但这些值分别不是有效的UTF-8编码字形.

如果查看UTF-8编码,则整数值0..127是原始US-ASCII字符集的编码.但是128..255(即所有字节)都是多字节UTF-8字符的一部分,因此不能对应于有效的UTF-8字符.

换句话说,单个字节'226'并不代表它自己的任何东西(因为它是3字节字符的前缀 - 正如预期的那样).所述printf呼叫打印它作为一个单一字节,这与UTF-8编码无效,因此,每个不同的节目科佩斯以不同的方式的无效值.

假设你只是想"看到"UTF-8字符的字节是什么,我建议你坚持你已经拥有的整数输出(或者如果更合理的话可以使用十六进制) - 因为你的> 127字节无效unicode你不可能在不同的程序中获得一致的结果.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有