Intelligence without ambition is a bird without wings.

2015-02-28
wprintf和printf问题

问题

两个函数若不经过处理,混合使用将导致另一方的输出无法显示。

原因

因为每个标准IO流都具有一个面向属性(面向单字节,面向宽字节),不能混合!

参考

  1. http://stackoverflow.com/questions/8681623/printf-and-wprintf-in-single-c-code
  2. http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Streams-and-I18N.html
  3. http://pubs.opengroup.org/onlinepubs/009696699/functions/xsh_chap02_05.html
阅读此文

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)

参考

  1. http://blog.csdn.net/dbzhang800/article/details/7540905
  2. C/C++ 编译后的二进制程序中字符串的保存方式
阅读此文

2015-02-28
Latin-1

Latin-1是ISO-8859-1编码的别名。

是一种ASCII编码的拓展编码,采用8位,针对于拉丁语系的编码,主要用于西欧语言。

参考

  1. http://zh.wikipedia.org/wiki/ISO/IEC_8859
  2. 维基-西欧
  3. 百度百科-西欧国家
  4. http://en.wikipedia.org/wiki/ISO/IEC_8859-1
阅读此文

2015-02-28
ANSI编码

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。

参考

  1. 维基-Windows(ANSI)代码页
  2. http://en.wikipedia.org/wiki/American_National_Standards_Institute
  3. 遇到乱码不怕不怕啦——计算机字符编码详尽讲解
  4. 百度百科-ANSI编码
  5. msdn-支持多字节字符集.aspx)
阅读此文

2015-02-28
windows编程常用宏定义

| 宏名 | 定义 | 头文件 |
|——–+——–+———|
| __T(x) | L ## x | tchar.h |

阅读此文

2015-02-27
VC命令行使用

  • 链接库

    cl main.cpp /link user32.lib
    
阅读此文

2015-02-27
vim-unicode-BOM设置

  • 查询当前文件是否带有BOM标记

    :set bomb?
    
  • 添加BOM

    :set bomb
    
  • 去除BOM

    :set nobomb
    

参考

  1. http://www.cnblogs.com/ini_always/archive/2011/12/24/2300621.html
阅读此文

2015-02-27
od

选项

  • -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
socket常用宏

| 宏名 | 值 | 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
python-list转string

1
string = ' '.join(list)
阅读此文