life's a struggle.
2015-02-28
2015-02-28
相关概念
源码字符集(the source character set)
源码文件是使用何种编码保存的
执行字符集(the execution character set)
可执行程序内保存的是何种编码(程序执行时内存中字符串编码)
问题产生的背景
C或C++中没有对源码字符集,执行字符集做规定,导致不同的编译器标准不统一
GCC
源码字符集和执行字符集默认都为UTF-8
且都可以手动指定(-finput-charset, -fexec-charset)
MSVC
源码字符集,有BOM么,有则按BOM解释,无则使用本地Locale字符集(随系统设置而变
执行字符集,使用本地Locale字符集(随系统设置而变)
wchar
wchar
采用unicode编码,具体编码方案与OS相关
- linux
采用UTF-32LE存储
- windows
采用UTF-16LE存储
与编译器相关
对单字节字符串(
char*
),编译器什么也不做,原样复制对宽字节字符串(
wchar_t*
),编译器需要转换GCC
根据源文件编码,将其转换为内部编码(UTF-32LE)
MSVC
源文件需为UTF-8或ANSI编码,将其转换为内部编码(UTF-16LE)
参考
2015-02-28
2015-02-28
ANSI编码是什么?
ANSI编码并不是一种编码!而是美国国家标准学会(American National Standards Institute)关于制作的ANSI C中关于区域字符编码的标准。
所以各地不同的编码方式统称为ANSI编码
在简体中文windows系统下,利用记事本等软件默认保存为ANSI编码
,对应的代码页为cp936
(GBK)。
ANSI编码采用1~4字节进行编码,是一种变长编码方案,又叫做多字节字符集(MBCS)。
ANSI编码的缺陷
ANSI编码都是各区域针对本地的编码方式,是在兼容ASCII编码的基础上拓充而来的,如GB2312,BIG5等。
因为各地编码存在冲突,所以无法做到互通。
ANSI编码怎么实现的?
原ASCII编码字符保持不变,仍然为占用1个字节。
对其他字符,采用多字节编码,第一字节(前导字节)具有一定特征来表明后续字节一起来表示一个字符,
如在GBK编码中,前导字节范围为0x81-0xFE。
参考
2015-02-28
| 宏名 | 定义 | 头文件 |
|——–+——–+———|
| __T(x) | L ## x | tchar.h |
2015-02-27
链接库
cl main.cpp /link user32.lib
2015-02-27
2015-02-27
选项
-t TYPE
指定输出格式,
TYPE由进制和多少字节组合决定,如x1,则以十六进制,每次输出1字节- a named character
- c ASCII character or backslash escape
- d signed decimal
- f floating point
- o octal
- u unsigned decimal
- x hexadecimal
- C char
- S short
- I int
- L long
- For floating point (f):
- F float
- D double
- L long double
-w BYTES
指定一行的宽度
-A, –address-radix=radix
指定文件偏移量显示的基数(d,o,x)
-j, –skip-bytes=BYTE
从BYTE(文件偏移量)开始显示
-c
把元素的内容按照ASCII码解释成对应的字符
实例
十六进制,按字节输出,并输出对应的ASCII字符
od -t x1 -c foo
同时按几种方式输出
od -tx1 -tc foo
跳过指定字节
od -Ax -tx1 -tc -j 0x065c main |less
2015-02-27
| 宏名 | 值 | winsock2 | linux |
|—————–+————+————————+—————————|
| AF_INET | 2 | winsock2.h => ws2def.h | socket.h => bits/socket.h |
| INADDR_LOOPBACK | 0x7f000001 | winsock2.h => ws2def.h | netinet/in.h |
| SOCKET_ERROR | -1 | winsock2.h | 无 |
2015-02-13
1 | string = ' '.join(list) |