广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中的字符串编码怎么处理
  • 611
分享到

C++中的字符串编码怎么处理

2023-07-06 13:07:47 611人浏览 泡泡鱼
摘要

今天小编给大家分享的是c++中的字符串编码怎么处理,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。今天由于在项目中用到一些与C++混合开发的东西 ,需要通过Socket与C++那边交换

今天小编给大家分享的是c++中的字符串编码怎么处理,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。

今天由于在项目中用到一些与C++混合开发的东西 ,需要通过Socket与C++那边交换数据,没啥特别的,字节码而已,两边确定一种编码规则就行了。我们确定的UTF-8。关于C++的 这种又是宽字节 又是MessageBoxW 又是MessageBoxA 的 ,说实话相比C#而言 搞的确实非常的和稀泥 搞的非常的糊,别说新手 有些不是新手的都搞不明白。

字符串字面量怎么被编码成字节的

什么是字符串?C#里的 string?C++里的char* ? 字符串的本质是什么?字符串不过是一个特殊的数据字节包装 带有编码信息,特别是C++的 更原始 更便于我们想清楚这个底层,其实其他的已经迎刃而解了。首先我们无论如何确定一个东西 那就是交换的东西是字节码 ,说白了 也就是C++ 里的char [ ] 也就是char *,在我不管你编码的情况下 我新建VC++项目 在代码里这样写:

char str1[] = "中a"; printf("%s\r\n", str1);

能不能输出东西?能不能输出中文 当然能,那这个str1 字节码到底是什么字节码, 只要我们把这个搞明白就可以了。一切未知的恐惧源于不明白。我们先调试C++代码 取到字节码,然后编写下面这两句C#代码:

 byte[] bts2 = new byte[] { 0xd6, 0xd0, 0x61 }; Console.WriteLine(Encoding.GetEncoding("gb2312").GetString(bts2));

正常输出了C++代码里的中文 由此可见C++里默认代码到字节 的字面量转换 就是gb2312 ,就这样而已。就这样而已 ,真的就这么点东西 ,不要探究是什么机制驱使VC++默认把字符串转换到了gb2312编码,事情不要歪呀歪的想想复杂了,人的精力是有限的 要放在有作用的地方。你看C++里是char [ ] 还不像C#的string经过包装的 更便于你想明白这个过程。不是说C++有std库么 不是有string 么 还没讲呢 ,C++这门语言呢又好又不好 设计特点是暴露的细节多 各个细节你都可以自己控制 让会用的人知道自己在做什么 ,但是也有些坑,其实string 就是char[] 的变种而已。你看C++里 在你琢磨不透的情况下悄然在你不知情编码的情况下转换成了字节码,C#的string 封装的 不会给你这个机会 有明确的Encoding库调用指定编码。

窄字符和宽字符 ,怎么个宽法

C++里字符串的字面量分为两种 一种是普通的窄字符 ,也就是普通的char [ ] 一个元素占1字节, 另一种是宽字符 wchar_t [ ] 一个元素占2字节,_T("中a") 或者L"中a" 这种就是强行表示Unicode宽字符字面量。 宽字符 怎么个宽法呢,我们说他是Unicode 也就是utf-16,我们用C#进行验证:

 byte[] bts3 = new byte[] {  0x2d,0x4e, 0x61,0x00, }; Console.WriteLine(Encoding.Unicode.GetString(bts3));

C++中的字符串编码怎么处理

C++中的字符串编码怎么处理

好了,这就明朗了,C++这玩意儿 由于历史遗留原因,直接在代码书写字符串字面量搞了两套标准 窄字符和宽字符 ,你看上面的同字符里面的字节码整的两套标准 这就很扯,整的被迫大多数C++的函数 或者接口都要按照这个套路玩。就有了看到的MessageBoxA ()接受char[]窄字符参数,MessageBoxW()接受宽字符参数 ,不要有误区哈 觉得char[ ] 就不能输出中文 ,能不能是由对应的地方能不能解析这个字节码决定的 而不是其他。

关于UTF-8

utf-8的现实意义更大于编程的字面量意义 ,为什么这么说,现在网络 数据交换都是UTF-8 编码,C++编程 字面量 没有所谓UTF-8这个说法 ,UTF-8是一种落地编码,落地编码 懂吗?就像图像编程 保存最终格式有.jpg .png,utf-8 他是变长的 对于字符串处理会出现很多问题 不利于程序处理,图像编程中不管你jpg png格式也好载入到内存中最后都是易于处理的BMP内存映像。编程中都是Unicode因为2字节代表一个字符 标标准准的 是对齐的,利于编程处理。还有 utf-8 一个中文3字节 其实比utf-16 一个中文2字节 多, 但是如果是英文的话 就是1字节 可以实现Unicode到ASCII的无缝转换 可以处理一些老旧系统的兼容问题。 C++里Unicode可以通过手段转换为UTF-8:

void UnicodeToUtf8(const wchar_t* unicode,char  utf82[],int * lenout){    int len;    len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);    char szUtf82[50] = { 0 };    *lenout = len;    WideCharToMultiByte(CP_UTF8, 0, unicode, -1, utf82, len, NULL, NULL);}

关于VC++项目属性里的设置字符集

什么意思呢:

C++中的字符串编码怎么处理

当选择“使用Unicode字符集”时,编译器会增加宏定义——UNICODE;而选择“使用多字节字符集”时,编译器则不会增加宏定义——UNICODE。https://blog.csdn.net/huashuolin001/article/details/95620424
当选用“使用Unicode字符集”时,调用函数MessageBox,实际使用的是MessageBoxW,MessageBoxW关于字符串的入参类型是LPCWSTR,使用MessageBox时,字符串前需加L::MessageBox(NULL, L"这是一个测试程序!", L"Title", MB_OK);

多字节,默认的窄字符char[]带中文 就是典型的多字节,接上面章节说明 多字节+中文 对于字符串处理分割 会带来很多问题,所以带中文请尽量使用宽字符。然后另一个 基于gb2312和Unicode编码我就不细说了哈,如果你想你的程序能够卖到国外在世界范围内使用,那么请使用Unicode,也就是 L" " 宽字符。C++里这些概念搞的比较糊 ,我描述的这些也是个意会 ,也许某些细节部分说错了 像原来文章里那些评论里那样 尖锐的指出来 不怕批评。

最后 ,一些测试的大杂烩代码:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iOStream>#include "h2.h"#include "FQtabData.h"#include "test1.h"#include <windows.h>#include <string>#include <iomanip>#include <type_traits>using namespace std;//引用的使用方式void test1(int &r){    r = r+1;}void UnicodeToUtf8(const wchar_t* unicode,char  utf82[],int * lenout){    int len;    len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);    char szUtf82[50] = { 0 };    *lenout = len;    WideCharToMultiByte(CP_UTF8, 0, unicode, -1, utf82, len, NULL, NULL);}int _tmain(int arGC, _TCHAR* argv[]){    setlocale(LC_ALL, "");//注意控制台输出要先加上这句哈要不然无法输出中文    wchar_t wstr2[] = L"中a";    wprintf(L"%ls\r\n", wstr2);    char str1[] = "中ab";    printf("%s\r\n", str1);    return 0;    //关于c++里的编码问题    //    并非 不在在项目属性里设置编码字符集 为Unicode 就不能显示中文    //char str11[] = "中a";         printf("%s", str11);    //这段代码照样显示中文,中a被编译器编成3个元素存在str11 里+\0结尾    //当选择“使用Unicode字符集”时,编译器会增加宏定义——UNICODE;而选择“使用多字节字符集”时,编译器则不会增加宏定义——UNICODE。    //Https://blog.csdn.net/huashuolin001/article/details/95620424    //当选用“使用Unicode字符集”时,调用函数MessageBox,实际使用的是MessageBoxW,MessageBoxW关于字符串的入参类型是LPCWSTR,    //使用MessageBox时,字符串前需加L    //::MessageBox(NULL, L"这是一个测试程序!", L"Title", MB_OK);    //关于这个L ,等同于_T("")  Tchar 这些玩意儿他们都有同等意义    //可以傻瓜的理解 L 本身就是搞一个宽字符型 字符串 ,每个字符占2字节    //wchar_t ws[] = L"国家";    //设置为Unicode 就意味着宽字符 就意味着字符串 要加L    //就像前面的 好多函数接口有两种版本 MessageBoxA MessageBoxW ,    //MessageBoxW就意味着你要传一个宽字符数组进去 也就是 wchar_t 或者L"dd"    //注意多字节字符集是一个很容易让人费解的玩意儿,    //我们说  utf-8是 一种Unicode的落地编码    //编程里都是用 Unicode 不管项目设没设置Unicode字符集 wchar_t ws[] = L"国家"; 得到的都是宽字符串    //但是编程代码里 没有utf-8 这一说法 utf-8是变长的 也就是多字节   他是一种编码落地    //你想想你整个变长 别人接口怎么写 ,怎么达到在让你用变长省内存的同时 识别你的有效字符    //如果数组里存utf-8 你想想 别人要以字节数读字符 半个的时候怎么搞    //这跟gdi图像处理是同一个道理 jpg png 各种是落地格式都可以读进来 但是到内存都是bmp    //还有不论哪种printf 或者其他接口 都不支持所谓的utf-8的参数 也没这种接口可言    //https://zhuanlan.zhihu.com/p/23190549    //前几天在微博上受到了@Belleve给我的启发,于是简单地实现了几个在 Windows    //下接受 UTF - 8 参数的 printf 系列函数。大致思路是判断当前 stdout / stderr    //是否为控制台,如果是控制台则将参数转为 UTF - 16 后调用 wprintf 输出,否则不转换直接调用 printf。    //L 是一个很微妙的 ,称之为转换为宽字符的字面量  什么叫字面量 根据你当前编程环境 以及源代码编码 转换成对应的字节    //L"发" 字面量 你细品    setlocale(LC_ALL, "");    printf("--------------------");    //wchar_t wc = L'破';    std::wstring wstr = L"破a的";    std::cout << wstr.size() << std::endl;    //utf-8 只是流行 ,事实上utf-8 一个汉字要占3字节  而utf-16一个汉字一字节        printf("--------------------//");    char utf82[50] = { 0 };    int len = 0;    UnicodeToUtf8(wstr2, utf82, &len);    //char* str222 = UnicodeToUtf8(wstr2);    //printf("%S", str222);    //printf("aaa");    return 0;    //    //c++ 中指针的变种  引用的使用方式    printf("aaa\r\n");    int a = 123;    int& b = a;    a = 456;    printf("%d \r\n", b);    test1(b);    printf("%d \r\n", b);    int c = 345;    test1(c);    printf("%d \r\n", c);    return 0;}

关于C++中的字符串编码怎么处理就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

--结束END--

本文标题: C++中的字符串编码怎么处理

本文链接: https://www.lsjlt.com/news/358535.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中的字符串编码怎么处理
    今天小编给大家分享的是C++中的字符串编码怎么处理,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。今天由于在项目中用到一些与C++混合开发的东西 ,需要通过socket与C++那边交换...
    99+
    2023-07-06
  • C++中的字符串编码处理方法
    目录字符串字面量怎么被编码成字节的窄字符和宽字符 ,怎么个宽法关于UTF-8关于VC++项目属性里的设置字符集今天由于在项目中用到一些与C++混合开发的东西 ,需要通过socket与...
    99+
    2023-05-20
    C++字符串编码 C++编码
  • C++字符串的处理详解
    目录字符数组总结字符数组 双引号引起的a占两个字符,包含“\0”。 字符串处理函数 连接的时候,str2中的1替换str1中的‘\0'; 比较函数按照str...
    99+
    2022-11-12
  • Python中的字符串与字符编码
    Hello,这里是Token_w的博客,欢迎您的到来 今天文章讲解的是Python中的字符串与字符编码,其中有基础的理论知识讲解,也有实战中的应用讲解,希望对你有所帮助 整理不易,如对你有所帮助,希望能得到你的点赞、收藏支持。感谢 ...
    99+
    2023-08-30
    python android 开发语言
  • C++中字符串处理问题的详解
    C++中字符串处理问题的详解在C++编程中,字符串处理是一个非常常见的任务。无论是读取用户输入、从文件中读取数据、或者进行数据处理和格式转换,字符串处理都扮演了重要的角色。本文将介绍C++中常见的字符串处理问题,并提供具体的代码示例。字符串...
    99+
    2023-10-22
    C++ 字符串处理 问题详解
  • C#中字符串怎么用
    小编给大家分享一下C#中字符串怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C#字符串分割string url = "...
    99+
    2023-06-18
  • Golang函数的字符串处理和字符编码转换技巧
    Golang作为一门编程语言,它所提供的字符串处理和字符编码转换功能非常强大和丰富。本文将介绍Golang函数中常用的字符串处理和字符编码转换技巧,帮助读者更好地理解和使用Golang。一、字符串处理字符串连接在Golang中,可以使用"+...
    99+
    2023-05-18
    字符串处理 Golang函数 字符编码转换技巧
  • C/C++编程怎么判断String字符串是否包含某个字符串
    这篇文章主要介绍“C/C++编程怎么判断String字符串是否包含某个字符串”,在日常操作中,相信很多人在C/C++编程怎么判断String字符串是否包含某个字符串问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-25
  • java怎么查看字符串编码
    可以使用以下方法来查看字符串的编码方式:1. 使用 getBytes() 方法将字符串转换为字节数组,然后打印字节数组的内容。jav...
    99+
    2023-10-18
    java
  • java字符串怎么转gbk编码
    在Java中,可以使用String.getBytes(String charsetName)方法将字符串转换为指定编码的字节数组。要...
    99+
    2023-10-18
    java
  • VBScript中的Base64编码字符串
    在VBScript中,可以使用`Base64Encode`函数来进行Base64编码。下面是一个简单的示例代码:```vbscrip...
    99+
    2023-09-26
    VBScript
  • C#中怎么匹配字符串
    本篇文章为大家展示了C#中怎么匹配字符串,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#匹配字符串大多数重要的正则表达式语言运算符都是非转义的单个字符。转义符 \(单个反斜杠)通知正则表达式分析器...
    99+
    2023-06-18
  • C#中怎么判断字符串
    C#中怎么判断字符串,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C#判断字符串应用之判断空字符串,首先明确””,null和string.Empty的区别:string.E...
    99+
    2023-06-17
  • C#中怎么截取字符串
    这篇文章给大家介绍C#中怎么截取字符串,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#截取字符串应用:C#截取指定长度中英文字符串方法public static string GetFi...
    99+
    2023-06-17
  • C#中怎么比较字符串
    今天小编给大家分享一下C#中怎么比较字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实例using Syste...
    99+
    2023-06-17
  • JavaScript中怎么实现字符串处理
    这篇文章将为大家详细讲解有关JavaScript中怎么实现字符串处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。字符串去重function un...
    99+
    2022-10-19
  • c#中怎么获取指定字符前的字符串
    本篇内容主要讲解“c#中怎么获取指定字符前的字符串”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c#中怎么获取指定字符前的字符串”吧!c#获取指定字符前的字符串问题描述Combobox的值为:1...
    99+
    2023-07-05
  • 深入理解JavaScript中的Base64编码字符串
    目录初步认识Base64是怎么诞生的基础定义编码方式体积增大= 等号非ASCII码字符编解码方法btoa 和 atob第三方库前端常见应用小图片转码文件读取Canvas生成图片其他总...
    99+
    2023-02-21
    JavaScript Base64编码字符串 JavaScript Base64编码 JavaScript Base64
  • Cython处理C字符串的示例详解
    目录楔子创建 C 字符串引用计数陷阱strlenstrcpystrcatstrcmpsprintf动态申请字符串内存memsetmemcpymemmovememcmp小结楔子 在介绍...
    99+
    2023-01-06
    Cython处理C字符串 Cython处理字符串 Cython 字符串
  • C++中字符串处理问题的解决方法
    C++中字符串处理问题的解决方法概述:在C++编程中,字符串的处理是一个常见的问题,涉及到字符串的截取、拼接、查找、替换等操作。本文将介绍几种常用的解决方法,并提供具体的代码示例。一、字符串截取字符串截取是指从一个字符串中获取一部分子串。在...
    99+
    2023-10-22
    C++ 解决方法 字符串处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作