首页 > 编程语言 >c++中的字符集与中文(宽字符)

c++中的字符集与中文(宽字符)

时间:2022-12-10 12:06:53浏览次数:62  
标签:字符 UTF name 编码 字符集 c++ ext cn

  首先要来说一说字符集和编码的关系,这两者既有交叉、又有异同。​​https://www.runoob.com/w3cnote/charset-encoding.html​

  就非西欧字符而言,比如中国以及港澳台,在任何编程语言的开发中都不得不考虑字符集及其表示。在c++中,对于超过1个字节的字符,有两种方式可以表示:

  1、多字节表示法;通常用于存储(空间效率考虑)。

  2、宽字符表示法,通常用于程序中(性能考虑)。

目前最主要或最常见的编码应该来说包括:

  • ASCII,7位。
  • ISO-Latin-1(字符集)/ISO-8859-1(编码),8位。
  • UCS-2,16位定长。
  • UTF-8,8-32位变长。
  • UTF-16,16或32位变长。
  • UCS-4/UTF-32,32位定长。

  对于特定的字符,各编码格式所占的字节数和编码值如下:

  

c++中的字符集与中文(宽字符)_宽字符

说到UTF-16/UTF-32,不得不说BOM(byte order mark),它的作用跟网络编程中的字节码顺序概念一样,用于标识使用big endian或者little endian。

c++中的字符集与中文(宽字符)_宽字符_02

无BOM的字节流开始:

c++中的字符集与中文(宽字符)_宽字符_03

带BOM的字节流开始:

c++中的字符集与中文(宽字符)_linux_04

   在c++中,并没有原生支持GBK/GB18050/UTF-8的编码,如下:

c++中的字符集与中文(宽字符)_linux_05

  基本上广泛用的就是char和wchar_t(默认是UCS-2编码,而c默认是ascii解析,所以一定要设置正确的locale,如setlocale(LC_ALL,"chs"))。

  对于常规控制台输入的,基本上网上很多demo了,所以接下去来看下从文件或者网络socket端过来的utf-8或者GBK编码如何处理的。

windows和linux下宽字符处理差异

// c++下常量字符串不能赋值给char指针
const wchar_t* cn_name;
const char* ext;
setlocale(LC_ALL, "chs"); // windows下必须使用chs,不能使用zh_CN.GBK,很多网上的示例是不正确的如https://wenku.baidu.com/view/40b0a0a672fe910ef12d2af90242a8956becaaac.html、javascript:void(0)。
t.ext = "ext name";
t.cn_name = L"中文扩展名balaba";
printf("ext=%s, cn_name=%ls\n",ext, cn_name); // ok 只有同时输出宽字符和标准字符才有意义,分开无意义
wprintf(L"cn_name=%s,ext=%s\n", cn_name, ext); // ext not ok

  所以除非特殊需求,日常情况下使用printf格式掩码ls即可满足日常需求。

  如果是跨平台编译,一定要确保原文件为UTF-8编码,不然windows下没有问题,到了linux下会报“error: converting to execution character set: Invalid or incomplete multibyte or wide character”,虽然加编译选项"-finput-charset=GBK"可以解决,但是并非上策。



标签:字符,UTF,name,编码,字符集,c++,ext,cn
From: https://blog.51cto.com/zhjh256/5927407

相关文章

  • C++日期和时间编程总结
    在C++11之前,C++编程只能使用C-style日期时间库,其精度只有秒级别,这对于有高精度要求的程序来说,是不够的。但这个问题在C++11中得到了解决,C++11中不仅扩展了......
  • C++手机运动信息管理系统
    C++手机运动信息管理系统《程序设计基本能力综合实训》实训案例名称:手机运动信息管理系统-----说明文档本案例主要完成手机运动信息的管理。主要功能包括:用户信息的......
  • io流之【字节/字符缓冲流】
    缓冲流,也叫高效流,是对4个基本的Filexxx流的增强,所以也是4个流,按照数据类型分类:字节缓冲流:BufferedInputStream,BufferedOutputStream字符缓冲流:BufferedReader,Buffered......
  • io流之字符流【基础流】
    相对于字节流来说,字符流本身就存在:缓冲区先解:缓冲区:reader-->sd-->bb作用:缓冲区位于内存当中,大大的提高了数据的读写效率!!!! ......
  • 前端开发系列004-基础篇之JavaScript的字符串
    title:'前端开发系列004-基础篇之JavaScript的字符串'tags:-javaScript系列categories:[]date:2017-03-3023:45:13本文将重点介绍javaScript语言中字符串,操作......
  • C++ Primer学习笔记 - 第17章 标准库特殊设施(正则表达式)
    目录17.3正则表达式17.3.1使用正则表达式17.3.2匹配与Regex迭代器类型17.3.3使用子表达式17.3.4使用regex_replace17.3正则表达式正则表达式(regularexpression)是......
  • C++学习---cstdio的源码学习分析03-文件重命名函数rename
    cstdio中的文件操作函数stdio.h中定义了文件删除函数remove,文件重命名函数rename,打开临时文件函数tmpfile,生成临时文件名函数tmpnam。接下来我们一起来分析一下rename对应的......
  • VSCode C/C++编译/调试配置文件
    VSCode其实是一款编辑器,再加上一系列的扩展之后,就可以作为IDE使用了,而且很多轻量方便的扩展非常有用,特别是remote-SSH,已经成为远程开发linux程序必不可少的工具,我是用VSCod......
  • C++
    通讯录管理系统1、系统需求通讯录是一个可以记录亲人、好友信息的工具。本教程主要利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中......
  • 前端开发系列004-基础篇之JavaScript的字符串
    title:'前端开发系列004-基础篇之JavaScript的字符串'tags:-javaScript系列categories:[]date:2017-03-3023:45:13本文将重点介绍javaScript语言中字符串,操作......