zoukankan      html  css  js  c++  java
  • 编程中的多字节和Unicode

    在编译许多程序的时候,我们常常会出现诸如指针转换错误或者const char[] 不能转换成XX的错误,这时很可能就是项目编码的问题了,如果您使用的是VS编程环境,那么打开工程属性,里面就有个选项是给你选择采用多字符集还是采用unicode。而对于这两者,我坚定不移的喜欢unicode~

      在多字节环境下,系统会按照ASCII字符表中128个字符进行截断操作,由于汉字是占用两个的字节的,所以在即有汉字又有英文的字符串中,该函数只会截断字符串右边英文字符,而对于汉字则无法处理。

      而对于Unicode字符集使用两个字节对世界上几乎所有的语言进行编码(0×0000-0xFFFF),它可以表达的字符数量为16位,即65536个字符,每种语言的代码段不同,两个字节所表达的字符是唯一的,所以在该环境下,每一个字符都有唯一的一个编码,那么在进行截断操作时,自然不会出现意料之外的结果。
     
      而我看过好几本有名气的C++的书中,都是说到一个项目或者程序的编码最好都选择Unicode(可是在几本国内出的书里不但没提及,而且提供的源代码也全都是“多字节”的),在此,我并没有鄙视多字节的意思,只是觉得写出通用的,跨语言的代码时候最好采用unicode。

      下面这段话是来自MSDN:

    要完成应用程序的 Unicode 编程,还必须:

    使用 _T 宏有条件地编写字符串的代码,使之可移植到 Unicode。
    当传递字符串时,请注意函数参数要求的长度是以字符为单位还是以字节为单位的。如果在使用 Unicode 字符串,这一区别是很重要的。
    使用 C 运行时字符串处理函数的可移植版本。
    使用以下用于字符和字符指针的数据类型:
    TCHAR 这里将使用 char。
    LPTSTR 这里将使用 char*。
    LPCTSTR 这里将使用 const char*。CString 提供 operator LPCTSTR 来在 CString 和 LPCTSTR 之间进行转换。
    CString 还提供识别 Unicode 的构造函数,赋值运算符和比较运算符。

      呵呵~补充一点就是使用_T的时候,如果系统提示你它是没有定义的标识符的话,带上atlstr.h就ok了。哈,又是一个笔记~

  • 相关阅读:
    Algs4-1.3.44文本编辑器的缓冲区
    Algs4-1.3.42复制栈
    Algs4-1.3.41复制队列采用for方式实现
    Algs4-1.3.39环形缓冲区
    Algs4-1.3.40前移编码
    Algs4-1.3.38删除第k个元素-数组实现
    安全测试的一些漏洞和测试方法
    Java内存自动回收,为什么会有内存泄露?
    三款主流静态源代码安全检测工具比较
    Fortify源码安全检测工具
  • 原文地址:https://www.cnblogs.com/tankeee/p/3957618.html
Copyright © 2011-2022 走看看