【发布时间】:2015-08-03 11:06:46
【问题描述】:
我有这个示例代码:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(void){
printf("%li\n",sizeof(char));
char mytext[20];
read(1,mytext,3);
printf("%s",mytext);
return 0;
}
第一次运行:
koray@koray-VirtualBox:~$ ./a.out
1
pp
pp
koray@koray-VirtualBox:~$
好吧,我认为这一切都是意料之中的,因为 p 是 ASCII 中定义的 1 字节长的字符,而我正在读取 3 个字节。 (2 个 p 和换行符)在终端中,我再次看到 2 个字符。
现在让我们尝试使用 2 个字节长的字符:
koray@koray-VirtualBox:~$ ./a.out
1
ğ
ğ
我不明白的是,当我将字符“ğ”发送到 mytext 变量指向的内存时,16 位被写入该区域。由于 'ğ' 在 utf-8 中是 11000100:10011110,因此这些字节被写入。
我的问题是,当打印回标准输出时,C(或者我应该说内核?)如何知道它应该读取 2 个字节并解释为 1 个字符而不是 2 个 1 字节字符?
【问题讨论】:
-
@DavidSchwartz 这对我有什么帮助?
-
确实没有。 UTF-8 平台倾向于实现
w_char -
C 中使用了两组不同的函数(用于 printf 等函数),一组用于 ASCII,另一组用于 UNICODE。 Microsoft 有一个使用
的扩展,其中程序可以使用相同的名称,例如 TCHAR 代替 char (ASCII) 或 WCHAR / wchar_t / unsigned short (UNICODE)、_tprintf()、_T("...")对于字符串文字, ... ,根据项目设置是 ASCII 或 UNICODE。