字符编码问题

字符编码的使用

字符编码主要分两种:MBCS以及 Unicode。 以 C/CC++ 为例,以 char 为单位的数组使用MBCS编码(如 ASCII,GB2312,BIG5),以wchar_t 为单位的数组使用Unicode作为编码。 

比如你的程序中使用:
char szTitle[] = "窗体标题“;
此时,szTitle字符串使用的的是MBCS编码,如果用户的操作系统不是中文的Windows,你的程序将无法正常显示! 

所以,要换成Unicode方式:
wchar_t szTitle[] = L"窗体标题";
此时,szTitle字符串使用的的是Unicode编码,加入你的程序以unicode方式编译,在任何语言的Windows上都能显示正常。 


字符编码的转换

有时候你从外部文件读进来的字符串是MBCS编码(如GB2312),而你程序里面都是统一用Unicode处理字符串,这时候要进行字符编码转换。 Windows为我们提供了很好用的API函数 MultiByteToWideChar  和 WideCharToMultiByte  帮我们轻松实现转换。  代码如下: 

GB2312 转换成 Unicode:

wchar_t* GB2312ToUnicode(const char* szGBString)
{
        UINT nCodePage = 936; //GB2312 
        int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
        wchar_t* pBuffer = new wchar_t[nLength+1];
        MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
        pBuffer[nLength]=0;
        return pBuffer;
}

BIG5 转换成 Unicode:

wchar_t* BIG5ToUnicode(const char* szBIG5String)
{
        UINT nCodePage = 950; //BIG5 
        int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);
        wchar_t* pBuffer = new wchar_t[nLength+1];
        MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);
        pBuffer[nLength]=0;
        return pBuffer;
}

Unicode 转换成 GB2312:

char* UnicodeToGB2312(const wchar_t* szUnicodeString)
{
        UINT nCodePage = 936; //GB2312 
        int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
        char* pBuffer=new char[nLength+1];
        WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
        pBuffer[nLength]=0;
        return pBuffer;
}

Unicode 转换成 BIG5:

char* UnicodeToBIG5(const wchar_t* szUnicodeString)
{
        UINT nCodePage = 950; //BIG5 
        int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
        char* pBuffer=new char[nLength+1];
        WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
        pBuffer[nLength]=0;
        return pBuffer;
}

繁体和简体的相互转换

利用Unicode作为媒介,还可以做出很有意思的应用。在处理中文过程中,一个经常用到的功能就是繁体和简体的互相转换。 代码如下: 

繁体中文BIG5 转换成 简体中文 GB2312

char* BIG5ToGB2312(const char* szBIG5String)
{
        LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);

        wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);
        char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);

        int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);
        char* pBuffer = new char[nLength + 1];
        LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);
        pBuffer[nLength] = 0;
        
        delete[] szUnicodeBuff;
        delete[] szGB2312Buff;
        return pBuffer;
}

简体中文 GB2312 转换成 繁体中文BIG5

char* GB2312ToBIG5(const char* szGBString)
{
        LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);

        int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);
        char* pBuffer=new char[nLength+1];
        LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);
        pBuffer[nLength]=0;

        wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);
        char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);

        delete[] pBuffer;
        delete[] pUnicodeBuff;
        return pBIG5Buff;
}

文本文件读写的编码问题 

当你的程序读一个文本文件时,如何判断文件中的字符是MBCS格式还是Unicode格式? Windows定义了一个"字节顺序标记"(Byte-order Mark)的概念:当一个txt文件的前2个字节为FF FE时,这个文件里面的字符采用Unicode编码, 如果没有字节顺序标记,就是MBCS编码。更多关于字节顺序标记的说明,请看 MSDN的官方资料 。

转自http://hingman.cnblogs.com/

Java中的字符编码问题 在处理字符编码问题时,我们需要注意输入输出流的编码一致性,数据库编码的匹配性以及网络传输编码的统一性。当处理不同的字符集或者字符编码时,有时会出现字符乱码的情况,即在输出或处理字符时,无法正确显示或解析字符。通过在输入输出流的构造函数中指定"UTF-8"字符编码,我们确保了文件的读取和写入都是使用相同的字符编码,从而避免了字符乱码问题。类,并在构造函数中指定正确的字符编码(例如"UTF-8"),我们可以确保读取和写入文件时使用相同的字符编码。字符编码问题通常是由于不同的编码方式之间的转换导致的。 阅读详情

相关推荐

VoIP概述

VoIP统一通信与VoIPVoIP与传统电话比较VoIP各项产品设备的类型及应用 统一通信与VoIP 统一通信指的是把计算机与传统通信技术统一成一体的新通信模式,融合计算机网络与传统通信网络在一个网络平台上,实现电话、传真、数据传输、音视频会议、呼叫中心、即时通信等众多应用服务 VoIP又称IP电话或IP网络电话,是Voice Over IP的缩写,这种技术通过对语音信号进行编码数字化,压缩处理成压缩帧,然后转换成为IP数据包在TCP/IP网络上进行传输,从而达到了在IP网络上进行语音通信目的 VoIP与传

kaminao的博客 4359

字符编码的问题

文章目录1、常见的字符编码格式有几种?2、不同的字符编码有什么区别?3、为什么会有不同的编码格式?4、计算机系统通用的字符编码工作方式是什么样的? 1、常见的字符编码格式有几种? ASCII GBK Unicode UTF-8 2、不同的字符编码有什么区别? ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。【如果 ASSIC 是计算机字符编码里的最小集,那 Unicode 就是试图编码字符最大集的一套编码标准】 GBK和ASCII编码的区别:GBK 只

额不食烟火 483

MID360+fastlio功能笔记

前言。

qq_35598561的博客 5300

各种字符编码问题

请看这里 转载于:https://www.cnblogs.com/caotao0918/p/10809666.html

weixin_30809173的博客 142

频偏估计技术:从原理到5G应用的实战解析

本文深入解析了5G通信中的频偏问题及其核心技术。频偏如同调不准的旋钮,会导致信号失真与载波间干扰。文章详细拆解了整数倍与小数倍频偏估计两大核心方法,重点剖析了基于循环前缀和基于同步信号块的算法原理与优劣,并结合eMBB、mMTC、URLLC三大5G应用场景,提供了实战算法选择策略与参数调优避坑指南。

weixin_29218963的博客 262

【DDSCAT——离散偶极近似仿真程序05】模型设计Matlab代码:多核壳球 、多核壳圆柱

简洁明了,后面及部分给出的都是模型设计的Matlab代码,这些代码都来自于一篇文章:Chin C W S. Localized Surface Plasmon Resonance with the use of Silver and Titanium Oxide Nanostructures[J]. 2011. 一、设计多个核壳球形结构 1)Matlab代码 ...

XD_Yangf的博客 4260

Java字符编码问题全面解析与解决方案

本文深入探讨了字符编码的理论与实践,重点分析了文件操作和网络传输中的编码问题。首先介绍了字符编码的核心概念和常见标准,详细解析了Unicode与UTF-8的特点。在Java字符表示部分,说明了UTF-16编码和代理对机制。针对文件操作,文章指出了常见的编码错误,并提供了正确的文件读写方式及编码转换技术。在网络传输方面,阐述了HTTP协议中的编码处理要点,包括响应编码设置和请求参数编码。全文通过具体代码示例,为正确处理字符编码问题提供了实用指导。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 2037

二、CANdelaStudio入门-版本介绍

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的各个版本,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YOCANdelaStudio——诊断需求定义工具,诊断协议开发软件 ①用户以模板概念为导向

诊断协议那些事儿's blog 1308

python字符编码问题_Python中怎么处理字符编码问题

Python中可以使用base64来处理字符编码问题,Base64是一种用64个字符来表示任意二进制数据的方法。用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。Base64的原理很简单,首先,准备一个...

weixin_39944542的博客 150

S7-200SMART 的运动控制(一)向导配置具体步骤(图文)

S7-200SMART 的运动控制(一)向导配置具体步骤(图文)

Robot_PLC_HMI_Automation 3849

YOLOv8安防监控实战:跌倒/闯入/徘徊实时检测(附TensorRT加速+声光报警部署代码)

精准性:针对跌倒/闯入/徘徊的行为特征优化,准确率达89.3%,误报率低于5次/天;实时性:TensorRT加速到50+FPS,报警延迟<1秒,满足安防“黄金响应时间”;低成本:无需专用AI芯片,RTX 3060或Jetson Orin就能跑,硬件成本比传统方案低60%;易部署:代码全开源,提供从模型训练到硬件联动的完整流程,2天即可搭起原型系统。如果你的安防监控还在“漏报误报”“响应慢”,建议先从跌倒检测的姿态过滤改起——用100张样本测试,再集成TensorRT加速,90%能看到明显改善。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 680

MySQL-字符编码问题

遇到这种情况,现有项目的数据库已经建好,数据表也已经创建完成。 问题来的,数据库不能插入中文,调试时候发现中文数据从发送请求到最后请求处理完成这些步骤,中文还没有发生乱码。 只有在存储到数据库后查询数据并显示才会乱码。 那么到此可以确定是mysql出现问题了。 那么应该怎么办呢?哈哈,当然是看我们的度娘啦! 看的下度娘解决方法是: 将数据库的编码修改为utf8编码格式,因为安装mysql默认使用的...

阿文的博客 479

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

MySQL(139)如何处理MySQL字符编码问题?

本文详细介绍了处理MySQL字符编码问题的完整方案。主要内容包括:设置数据库和表使用UTF-8编码,配置MySQL服务器参数,确保应用程序连接使用UTF-8编码,以及验证和修正现有数据编码的方法。重点提供了创建UTF-8数据库/表的SQL语句、修改MySQL配置文件的示例、Java连接数据库的字符编码设置方法,以及处理乱码数据的修正代码。通过确保数据库、服务器、连接和应用程序各环节的编码一致性,可以有效解决MySQL字符编码问题,保证数据的正确存储和显示。

qq_43012298的博客 793

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

一文读懂字符编码从此解决乱码问题

一、 引入 ​ 字符串类型、文本文件的内容都是由字符组成的,但凡涉及到字符的存取,都需要考虑字符编码的问题。 ​ 字符编码这个知识点的典型特征就是理论多、结论少,但对于开发而言只需要记住结论即可。 二 知识储备 2.1 三大核心硬件 所有软件都是运行硬件之上的,与运行软件相关的三大核心硬件为cpu、内存、硬盘,我们需要明确三点 软件运行前,软件的代码及其相关数据都是存放于硬盘中的 任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行 软件运行过程中产生的数据最先都是存放

人丑就要多读书的博客 776

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

关于字符编码的问题

为什么要处理字符编码: 只要对字符有意识的程序都要处理输入输出内部编码locale 问题

yishengxiao的专栏 284

IDEA 字符编码转换问题

IDEA 字符编码转换问题 之前学习都使用用Eclipse,由于IDEA的美观和提示功能功能非常强大,现在改用IDEA。 但是在转变的过程中就遇到字符编码转换问题。 windows下默认的编码GBK,Eclipse中默认的编码也是GBK,IDEA中默认的是UTF-8。 一个中文在GBK中是占两个字节,在UTF-8中是三个字节,这样就导致了用UTF-8模式去读GBK的文档就会导致乱码。经过百度和以前...

weixin_43300793的博客 5132

c++字符编码/乱码问题

之前我存在错误的认知:认为Unicode=UTF-16,实际上这是错误的理解,Unicode是一种字符集,它并不是编码方式,Unicode可以以不同的方式编码,还有一些错误的理解,比如我经常用使用qt框架进行开发,qt框架中的QString采用的就是UTF-16编码,在有些文章中没有描述清楚,仅仅是说QString采用的是Unicode字符串进行编码的,造成了我认为Unicode=UTF-16的印象。肯定是按照UTF-8格式进行存储,所有的字符都进行存储,包括双引号、分号、等号,换行符等。

漫步者 1375

建议收藏,彻底搞懂字符编码问题,从此告别中文乱码

在中文的语言环境里,身为程序员的我们一定会遇到过中文乱码的情况,究其原因就是字符编码的问题。在没有深入理解其原理之前,会觉得中文编码问题比较谜,莫名其妙地乱码,又稀里糊涂地好了。字符编码...

xmt1139057136的专栏 1999

sitemesh的字符编码问题

今天帮朋友解决了一个sitemesh很奇怪的字符编码问题。开发环境是NetBeans 4.1 + Tomcat。之前在此环境下开发的Web项目很正常,最近朋友决定使用sitemesh来管理页面,结果问题出来了:CSS、HTML、JSP等文件均没问题,但就是不能显示图像。并且每刷新一下页面,Tomcat就会报错:严重: Javac exception Compile failed; see the

Sarkuya的编程园地 2156

字符编码常识及问题解析

基本常识 1. 位和字节 说起编码,我们必须从最基础的说起,位和字节(别觉得这个过于简单不值一说,我还真见过很多个不能区分这两者的程序员)。位(bit)是指计算机里存放的二进制值(0/1),而 8 个位组合成的“位串”称为一个字节,容易算出, 8 个位的组合有 256(28)个组合方式,其取值范围是 00000000-11111111,常用十六进制来表示。比如 01000001 就是一个字节

hao741100265的专栏 588
上一篇: 字符编码问题
下一篇: 创建Python Egg
pythoner
博客等级 码龄18年 15粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值