如下程序:
#include <stdio.h>
int main()
{
char s[7] = "七 123";
int i;
for (i = 0; i < 7; i++)
{
printf("%d,", s[i]);
}
}
打印出来的结果是:-28,-72,-125,49,50,51,0,
前面的-28,-72,-125 正是七的 utf8 编码
要是我想打印出七的 gbk 编码应该怎么办?
1
bczhc 284 天前
c 语言没有严格规定的字符编码,一般跟系统设定有关。如果只能在程序中获取到 utf-8 ,那就得用 utf8-gbk 转换库
|
2
nullyouraise 284 天前
取决于你这个文件的编码
|
3
rekulas 284 天前
用 iconv 转 或者手写转换
|
4
rookiemaster OP @nullyouraise 谢谢,正解
|
6
Noicdi 284 天前 via iPhone 1
取决于你在编译时的源文件是通过什么字符编码保存的
|
7
BD8NCF 284 天前 1
你的代码文件使用 GBK 就可以得到了。
现在大部分的 IDE 都使用 utf8 另外,如果你对编码有兴趣,应该习惯看十六进制才行。 printf("0x%02X,", s[i]); |
8
shawndev 284 天前 2
了解 icu, iconv, chardet 对你的问题很有帮助。
|
9
jim9606 284 天前
C/C++本身没有定义要用那种字符编码,取决于编译器的处理方式和运行平台。
如果你的源码文件带 UTF-8 BOM ,当前版本的 MSVC 和 GCC 都会将编译器字面量作为 UTF-8 字符串处理。 MSVC/GCC 都有选项强制指定编译编码和运行编码。 转编码的话虽然标准库有 codecvt 库,但应该没啥人用,都用 WideCharToMultiByte/iconv/ICU 。 |
10
dianso 284 天前
用百分比编码比较好
|
11
wjx0912 283 天前
字符集和编码的区别,这个搞清楚就行
|
12
CLMan 283 天前
美国是现代计算机的发源地,当时的先驱们只考虑了英文字符,也即是 ASCII 。C 语言诞生的时候,还处于计算机的早期发展阶段(大陆同期还在文革),因此当时只考虑到 ASCII ( char 类型的概念及相关标准库)。
后来,C 语言流传到各个国家,对汉字等非英文字符的支持,都是非官方标准,需要修改编译器和标准库实现。主要考虑两点: - 字符常量的编码,字符串常量被编码为字节存储在库或者可执行文件里面 - printf 等涉及编码的标准库函数 再后来,C 标准更新,以增加对非英文字符的支持,比如: - C99 支持使用转义字符形式的 Unicode 标识符 - C11 在语言上支持 u,U,u8 前缀表示的 UTF16,UTF32,UTF8 字符串,在标准库 uchar.h 里提供了 Unicode 支持 - C23 支持使用 u8 前缀表示的 UTF-8 单字节字符 ------ 字符集和字符编码应当是 CS 专业的基础知识(计算机科学概论),ASCII,ISO-8859,GB2312,GBK,Unicode(包括 UCS-2,UCS-4),UTF-8&UTF-16&UTF-32(以及 LE,BE,BOM)是计算机发展史在字符上的一个切面,可以参考阮一峰的博文: https://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html |