C语言中,让人又爱又恨的字符串编码

引言

在C语言的世界里,字符串编码是一个让人既爱又恨的话题。
所有的打印信息,都是以字符串输出的。但是,大家在编码的时候,经常会遇到一些情况,稍不注意,就会导致显示出乱码,到了客户那里,就尴尬了。
今天,我们就来聊聊这场混战中的三位主角:Unicode、ANSI和UTF-8。

编码格式简介

ANSI编码

ANSI编码,全称“美国国家标准协会编码”,是一种基于单字节的编码方式。它在西欧语言中大行其道,因为一个字节足以表示所有的字符。
所以,多数时候,只要我们打印的时候,用英文字母,通常就不会出问题。
但是一个字节的编码,在面对中文、日文等复杂字符时,它就完全不够了。于是就有了扩展字符编码。继续往下看。

Unicode编码

Unicode编码,旨在统一全球所有字符的编码方式,它是一个多字节的编码系统。Unicode的出现,让世界上的每个字符都有一个唯一的编码,但这也意味着它需要更多的存储空间。
如果固定是4字节,即32位,那么就称之为UTF-32编码。
UTF-16编码,在大多少情况下,占用2个字节,有时候为了扩展,也会占用4字节。
但是这两种编码,占用存储空间比较大。
更加常用的,则是UTF-8编码,继续往下看。

UTF-8编码

UTF-8编码,是Unicode的一种实现方式,它是一种可变长度的编码系统。
UTF-8的特点是它兼容ASCII,对于英文字符,UTF-8和ASCII是相同的,占用1个字节。对于其他字符,它可以表示2到4个字节。
相比UTF-16和UTF-32而言,占用空间就小多了。因此也更加受欢迎。当然,还有其它一些方面的原因。

编码格式的C语言实现

ANSI编码

在C语言中,ANSI编码通常通过char类型来处理。以下是一个简单的示例:

char ansiString[] = "Hello, World!";

这里,ansiString是一个ANSI字符串,它在大多数西欧语言中都能正常工作。

Unicode编码

Unicode在C语言中的处理稍微复杂一些,通常需要使用wchar_t类型。以下是一个Unicode字符串的例子:

wchar_t unicodeString[] = L"Hello, 世界!";

这里的L前缀告诉编译器这是一个宽字符字符串。在Windows平台上,这通常是UTF-16编码。

UTF-8编码

UTF-8在C语言中的处理与ANSI类似,但是需要确保编译器正确处理UTF-8编码。以下是一个UTF-8字符串的例子:

char utf8String[] = u8"Hello, 世界!";

这里的u8前缀是某些编译器用来表示UTF-8字符串的。

编码转换示例

在实际应用中,我们经常需要在不同的编码之间进行转换。

ANSI和Unicode之间的转换

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <windows.h>int main()
{setlocale(LC_ALL, ""); // 设置本地化环境const char* ansiString = "世界,你好!";wchar_t* unicodeString = NULL;// ANSI到Unicodeint unicodeLength = MultiByteToWideChar(CP_ACP, 0, ansiString, -1, NULL, 0);unicodeString = (wchar_t*)malloc(unicodeLength * sizeof(wchar_t));MultiByteToWideChar(CP_ACP, 0, ansiString, -1, unicodeString, unicodeLength);printf("ANSI: %s\n", ansiString);wprintf(L"Unicode: %ls\n", unicodeString);free(unicodeString);return 0;
}

以上代码,可以直接复制编译和运行,运行结果如下:
在这里插入图片描述

Unicode和Utf-8之间的转换

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>int main() {// 设置本地化环境setlocale(LC_ALL, "en_US.UTF-8");// Unicode字符串const wchar_t* unicodeString = L"世界,你好!";// 获取转换为UTF-8所需的缓冲区大小int utf8Length = WideCharToMultiByte(CP_UTF8, 0, unicodeString, -1, NULL, 0, NULL, NULL);if (utf8Length == 0) {printf("WideCharToMultiByte failed with error %d\n", GetLastError());return 1;}// 分配缓冲区char* utf8String = (char*)malloc(utf8Length * sizeof(char));if (utf8String == NULL) {printf("Memory allocation failed\n");return 1;}// 执行转换int result = WideCharToMultiByte(CP_UTF8, 0, unicodeString, -1, utf8String, utf8Length, NULL, NULL);if (result == 0) {printf("WideCharToMultiByte failed with error %d\n", GetLastError());free(utf8String);return 1;}// 输出结果printf("UTF-8 string: %s\n", utf8String); wprintf(L"Unicode: %ls\n", unicodeString);    // 释放内存free(utf8String);return 0;
}

以上代码,可以直接复制编译和运行,运行结果如下:
在这里插入图片描述

总结

在C语言中处理字符串编码,这个过程可能会有些复杂,但一旦掌握了这些知识,你就能在不同语言和平台之间自如地穿梭。
实际上,字符串编码的内容比上面还要多,本文算是浅尝辄止吧。有时间,真可以写成一篇更深入的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx openresty lua-resty-http 使用的一些问题记录

需求背景 需求是使用 nginx 做一个 https 服务的代理 nginx 收到 http 请求后&#xff0c;需要修改 body 中的某些参数值&#xff0c;然后将修改后的数据发送到目标服务器&#xff08;https&#xff09; 本来以为很简单的需求&#xff0c;结果中间出现了不少岔子&#xff0c;这…

vue2+ element ui 集成pdfjs-dist

目录 1. 下载Pdf.js1.1 下载1.2 修改配置1.2.1 将pdfjs-3.8.162-dist复制到项目中1.2.2 解决跨域问题1.2.3 将pdf.worker.js文件复制到public目录下1.2.4 安装 pdfjs-dist1.2.5 前端vue代码(示例) 3. 参考资料 1. 下载Pdf.js 1.1 下载 下载链接&#xff08;官方&#xff09;需…

「Mac玩转仓颉内测版2」入门篇2 - 编写第一个Cangjie程序

本篇详细介绍在Mac系统上创建首个Cangjie项目并编写、运行第一个Cangjie程序的全过程。内容涵盖项目创建、代码编写、程序运行与调试&#xff0c;以及代码修改后的重新运行。通过本篇&#xff0c;掌握Cangjie项目的基本操作&#xff0c;进一步巩固开发环境的配置&#xff0c;迈…

接单渠道,程序员看这篇就够了。

接单、兼职&#xff0c;有团队没单子&#xff1f;僧多粥少&#xff0c;苦矣。 很多程序员&#xff0c;有时间、有技术&#xff0c;有steam&#xff08;咳咳&#xff0c;不对&#xff0c;是team&#xff09;。但是&#xff0c;可能还是挣不到什么钱&#xff0c;何也&#xff1f…

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改&#xff0c;代码精略的写了一下。 注&#xff1a;场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅&#xff0c;自行处理。有个方法是直接在每个外面包一个DIV&#xff0c;用动态样式设置底色。 场景一、…

Qt_day4_Qt_UI设计

目录 Qt_UI设计 1. Designer 设计师&#xff08;掌握&#xff09; 2. Layout 布局&#xff08;重点&#xff09; 2.1 基本使用 2.2 高级用法 2.3 代码布局&#xff08;了解&#xff09; 3. Designer与C的关系&#xff08;熟悉&#xff09; 4. 基本组件&#xff08;掌握…

数据结构的时间复杂度和空间复杂度

目录 时间复杂度 空间复杂度 时间复杂度 基本操作的执行次数&#xff0c;为时间复杂度。 我们使用大O的渐进表示法来表示时间复杂度。 怎么使用&#xff1f; 先看例子&#xff1a; 在这个例子中&#xff0c; 基本操作为变量 count 的 加加 操作&#xff0c;并且&#xff0c;执行…

【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost

文章目录 1、XGBoost Algorithm2、Comparison of algorithm implementation between Python code and Sentosa_DSML community edition(1) Data reading and statistical analysis(2)Data preprocessing(3)Model Training and Evaluation(4)Model visualization 3、summarize 1…

Rust Struct 属性初始化

结构体是用户定义的数据类型&#xff0c;其中包含定义特定实例的字段。结构有助于实现更容易理解的抽象概念。本文介绍几种初始化结构体对象的方法&#xff0c;包括常规方法、Default特征、第三方包实现以及构建器模式。 Struct声明与初始化 struct Employee {id: i32,name: …

AI大模型微调:Qwen2大模型微调入门实战(完整代码)

简介&#xff1a; 该教程介绍了如何使用Qwen2&#xff0c;一个由阿里云通义实验室研发的开源大语言模型&#xff0c;进行指令微调以实现文本分类。微调是通过在&#xff08;指令&#xff0c;输出&#xff09;数据集上训练来改善LLMs理解人类指令的能力。教程中&#xff0c;使用…

基于Python+Django+Vue3+MySQL实现的前后端分类的商场车辆管理系统

项目名称&#xff1a;基于PythonDjangoVue3MySQL实现的前后端分离商场车辆管理系统 技术栈 开发工具&#xff1a;PyCharm、Visual Studio Code (VSCode)运行环境&#xff1a;Python 3.10、MySQL 8.0、Node.js 18技术框架&#xff1a;Django 5、Vue 3.4、Ant-Design-Vue 4.12 …

C++初阶:类和对象(上)

1. 类的定义 1.1 类的定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{ } 中为类的主体&#xff0c;注意类定义结束后的分号不能省略。类体中的内容为类的成员&#xff1a;类中的变量称为类的属性或成员变量&#xff1b;类中的函数称为类的方法或成员…

ctfshow DSBCTF web部分wp

ctfshow 单身杯 web部分wp web 签到好玩的PHP 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public function __destruct() {$this->d (string)$this->d;$this…

【分布式】万字图文解析——深入七大分布式事务解决方案

分布式事务 分布式事务是指跨多个独立服务或系统的事务管理&#xff0c;以确保这些服务中的数据变更要么全部成功&#xff0c;要么全部回滚&#xff0c;从而保证数据的一致性。在微服务架构和分布式系统中&#xff0c;由于业务逻辑往往会跨多个服务&#xff0c;传统的单体事务…

边缘计算在智能物流中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 边缘计算在智能物流中的应用 边缘计算在智能物流中的应用 边缘计算在智能物流中的应用 引言 边缘计算概述 定义与原理 发展历程 …

Spring Boot框架:电商开发的新趋势

5 系统实现 系统实现部分就是将系统分析&#xff0c;系统设计部分的内容通过编码进行功能实现&#xff0c;以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析&#xff0c;系统设计最主要还是进行功能&#xff0c;系统操作逻辑的设计&#xff0c;也包括…

本地源配置 以及ssh 和 nfs

安装软件的三种方式 apt 仓库 在/etc/apt/sources.list文件下 在线源 离线包 修改离线包 挂载并更新 ssh远程管理 sshd的配置文件 服务器命令行的远程登录方式 远程复制 先在第一台主机上创建文件 使用scp命令复制 sftp ssh的密钥登录 创建rsa密钥 将密钥文件传给另一台主机…

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

【MMIN】缺失模态想象网络用于不确定缺失模态的情绪识别

代码地址&#xff1a;https://github.com/AIM3RUC/MMIN abstract&#xff1a; 在以往的研究中&#xff0c;多模态融合已被证明可以提高情绪识别的性能。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到模态丢失的问题&#xff0c;而哪些模态会丢失是不确定的。这使得…

图像处理实验四(Adaptive Filter)

一、Adaptive Filter简介 自适应滤波器&#xff08;Adaptive Filter&#xff09;是一种能够根据输入信号的统计特性自动调整自身参数以达到最佳滤波效果的滤波器。它广泛应用于信号处理领域&#xff0c;如信道均衡、系统识别、声学回波抵消、生物医学、雷达、波束形成等模块。 …