我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:主页 > 编码字符 >

字符类型及字符编码

归档日期:10-15       文本归类:编码字符      文章编辑:爱尚语录

  • wchar_t 是操作系统内核采用的字符编码,不同的系统,字节数和编码也不同。

  • “宽字符版本” 是指 UNICODE 版本,用来区别 ANSI 版本的程序或软件。

  因为不同的系统或开发工具,都会提供两相同或相似的函数,分别处理 wchar_t 和 char 类型的文字。

  Linux: UTF-8单个字符。单引号只能表示一个字符,是一个整数值,等于这个字符的编码值。

  Linux: UTF-32单个字符。大写英文字母 L 开头的单引号,只能表示一个 wchar_t 字符,是一个整数值,等于这个字符的编码值。

  Linux: UTF-8双引号字符串,长度仅受内存大小的限制,是这些字符的编码值构成的 char 型数组,在最后一个字符的后面,会自动添加一个作为结束符的字符,编码值为 0。

  大写英文字母 L 开头的字符串,长度仅受内存大小限制,是这些字符的编码值构成的 wchar_t 数组,在最后一个字符的后面,会自动添加一个作为结束符的字符,编码值为 0。

  小写英文字母 u 开头的字符串,长度仅受内存大小限制,是这些字符的编码值构成的 char16_t 数组,在最后一个字符的后面,会自动添加一个作为结束符的字符,编码值为 0。

  大写英文字母 U 开头的字符串,长度仅受内存大小限制,是这些字符的编码值构成的 char32_t 数组,在最后一个字符的后面,会自动添加一个作为结束符的字符,编码值为 0。

  C/C++ 的两个字符串常数之间如果只有空格和换行,没有其他符号,这两个字符串是连接在一起的,例如:

  得到的字符串 s 是 Labcdefghijklmn,两个字符串常数之间没有除了空格和换行之外的符,会连接在一起,一直到分号结束。

  上面程序的 s 和 t 是完全一样的效果,两个字符串常数之间没有除了空格和换行之外的符号,会连接在一起,需要换行必须要有 \r\n。

  一般在宏定义的时候必须使用续行符,而字符串常数不是必须使用续行符的,下面是一个使用续行符的例子:

  上面的例子,s 和 t 得到同样的字符串常数,反斜线 \ 在行末,作为续行符,相当于下一行的内容连接在这个位置,下一行的内容 def\ 必须从行首开始写,如果有空格,也会把空格连在字符串里面。

  GB2312/GBK 编码:z 是单字节的,c 得到的是字符 z 本身

  GB2312/GBK 编码:z 是单字节的,在 int 的取值范围之内,i 得到的是字符 z 的编码,与 z 的 ASCII 值相等

  GB2312/GBK 编码:我 是双字节的,编码值为 0xCED2,c 得到的是低位字节 0xD2,高位丢失,很显然这并不是期望的值。0xD2 在 GB2312/GBK 里面是不完整的编码,即所谓的 “半个汉字”。

  GB2312/GBK 编码,我 是双字节的,正好在 unsigned short 的取值范围之内,得到编码值为 0xCED2。

  GB2312/GBK 编码,a, b, c 都是单字节编码,他们给 char 数组对应的每个元素赋值的时候,都能得到正确的值。

  GB2312/GBK 编码,你 的编码是 0xC4E3,好 的编码是 0xBAC3,他们分别赋值给 char 之后,都取了低位字节,即 s[0] = 0xE3 和 s[1] = 0xC3,这两个字符组成一个编码为 0xE3C3 的双字节字符,正好是汉字 忝 的 GB2312/GBK 编码。

  由于单引号里面是多个字符,他们会组成 4 个字节的字符编码,编译器会提出警告,丢失放在编码高位的字节,c 得到最低位字节 z;

  由于单引号里面是多个字符,他们会组成 4 个字节的字符编码,w、x、y、z 的编码值分别为 0x77, 0x78, 0x79, 0x7A。

  ANSI 编码的 我 认为是 GB2312/GBK 编码的,程序运行时进行编码转换,转为 UTF-16 编码的对应的字符,得到 L我。由于产生了不必要的编码转换,少写了一个 L 会引起到不同代码页的地区出现乱码,很显然这不是我们预期的结果。

  UTF-16 编码的 L𠀾 是 2 个 char16_t 的编码:0xD840, 0xDC3E,而在 Windows 系统里面的 L𠀾 只能得到第一个编码值 0xD840

  尽管 i 是 4 个字节的,能够放得下 2 个 char16_t 编码,但是 L𠀾 这个写法只能够得到第一个编码,所以还是 0xD840

  字符串长度仅受内存大小的限制,所以无论几个 char16_t 的 UTF-16 编码的字符,都可以正常放在字符串里面,得到正确的值。

  小写英文字母 u 开头的单引号,只能表示一个 UTF-16 单个 char16_t 编码的字符,u𠀾 是 2 个 char16_t 编码的字符,所以无法编译通过

  字符串长度仅受内存大小的限制,所以无论几个 char16_t 的 UTF-16 编码的字符,都可以正常放在字符串里面,得到正确的值。

  大写引文字母 U 开头的是 UTF-32 编码,字符编码就是 UNICODE 码本身,所以始终是正确的

  大写引文字母 U 开头的是 UTF-32 编码,字符编码就是 UNICODE 码本身,所以始终是正确的

  大写引文字母 U 开头的是 UTF-32 编码,字符编码就是 UNICODE 码本身,所以始终是正确的

  UnicodeString s = L字符串;

  运行时把 UTF-16 编码的字符串转为 ANSI 编码,即 GB2312/GBK。产生不必要的转码,并且不会从根本上解决乱码问题。例如到英国的电脑里面运行,只剩下英文和数字了,到日本的电脑里面会显示出来一部分日本 Shift-JIS 编码里面的汉字,而不是全部汉字。

  虽然变量是 UnicodeString 类型的,但是 字符串 是 ANSI 编码的,运行时会从 ANSI 编码转为 UTF-16 编码,这样在代码页不同的地区运行,就会乱码。

  定义变量时赋初始值,调用的是 WideString 的构造函数,构造出来一个新的 BSTR 并且赋值为 L字符串

  无论哪个国家的文字,一个字符就是一个字符,一个汉字、一个英文字母、和一个俄语字母……,他们都是一个字符,没有区别,处理文字简单,无论是编辑框还是数据库,对于能够容纳的字符个数都不用给用户复杂的解释

  一个汉字是两个字符 (GBK/GB2312 是这样,如果 GB18030 是 2 或 4 个字符) 这个说法根深蒂固,一直在困扰着大家,在输入文字,或者创建数据库的时候,对于字符个数的描述都是这里能容纳的汉字个数是英文字母个数的一半,大家都在研究怎么判断一个字符是汉字还是英文,给用户的解释也很复杂

  文字中间坏掉一个字节,只能影响这个字节及后面附近的一个或几个字符,不同的编码类型会不同,但是不会导致后面所有的字符都乱码

  从 Windows 2000 开始,操作系统内核就是 UNICODE 了,ANSI 编码需要根据代码页转换到 UNICODE 来执行

  ANSI 编码是为了兼容 Windows 9x 保留下来的,会按照默认的代码页处理,转换编码到 UNICODE 上执行,默认的代码页可以在控制面板里面修改

  • ANSI 版本的函数都很复杂,虽然使用上可能会看起来比较简单,他们内部无论在处理什么,都必须都是从第一个字节开始解析的,这样才能保证不乱码。

  • 由于处理 ANSI 的函数效率特别低,系统和开发工具都会提供两套不同的函数:一套是常用的,不持处理双字节和多字节字符,但是效率很高的,另一套是不常用的,专门对付必须处理双字节和多字节字符的函数,但是效率很低。

  • 我是新 Windows 程序猿,当然是学习前辈的经验,没听说 UNICODE 呀!😕

  • UNICODE 再简单大家也都发蒙,因为书和资料都是你抄我、我抄你,老资料总也不更新,新资料也跟不上。😞

  • 大家都喜欢听老程序猿乐此不疲的讲 ANSI 难题,没了难题的 UNICODE 真的太不习惯了!😏• ANSI 的习惯根深蒂固,无法动摇。

  • 那个年代,有经验的人都认认真真的写书,写资料,没有经验的人都在认认真真的看书,看资料。不但书和资料多,质量也很好,一直到现在都是大家抄袭的对象。

本文链接:http://foungjampee.com/bianmazifu/208/