字符编码问题

Java中字符编码问题的解决方法 本文聚焦于Java开发中字符编码问题,阐述其常见类型如平台兼容性、文件读写、网络传输及数据库操作导致的乱码,详细介绍通过明确指定编码方式、设置JVM默认编码、正确处理异常、使用第三方库等解决策略,助力开发者有效应对字符编码挑战,提升程序兼容性与可靠性。 阅读详情
字符编码的使用

字符编码主要分两种: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/

两相变频交错PFC实战:从论文理论到PSIM仿真的完整避坑指南 本文详细解析了两相变频交错PFC技术从理论到PSIM仿真的完整实现过程,特别针对CRM模式下的BOOST PFC设计挑战提供实用解决方案。涵盖周期值比较法与RS触发器法的对比实施、PSIM仿真中的过零处理与收敛性优化等核心问题,并给出硬件实现的进阶建议,助力工程师高效完成高功率密度PFC设计。 阅读详情

相关推荐

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

蜗牛的专栏 3435

【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”

窗口在 Windows 中指一个矩形区域,一般情况下这个区域是用户与应用程序交互的枢纽;上一小节使用 MessageBox 创建的简单窗口也是与用户交互的一个窗口,该窗口的功能有限,只能够简单的展示一些想要表达的信息,想创建一个能表达更多信息的窗口,可以使用 CreateWindow 函数创建。 ...

1_bit 的博客 4111

TOEIC托业词汇汇总(完整版)

1.appointment 约会,约定2.attendance 出席人数;出席3.cabinet 橱柜4.calendar 日历;月历;行事历5.clerk 办事员,书记6.directory 人名住址薄7.duplicte 复制;副本8.filing 归档9.in-tray 待处理文件盒10.monitor 检测;监视;追踪11.out-tray 已处理文件盒12.partition 分隔;分隔物(如墙壁等)13.postage 邮费。

weixin_39676449的博客 1万+

Windows 桌面窗口 Z 序移动 [测试]

Windows 桌面自定义WorkerW分层窗口 脱离系统消息的使用,自定义分层窗口的部分功能,实现在桌面嵌入任意窗口。

溡漪幽博客 2667

Unity采样器过多导致URP默认的Lit.Shader报错(shader error in ‘universal render pipeline/lit’: maximum ps_4_0 samp)

Shader中多个Sample Texture2D,Sample Texture3D或者类似节点的使用,该类节点都需要一个采样器,如果Shader使用超过了16个纹理采样器,如多个Base Color,Normal Map等,就容易超出。是因为每种Shader Model和GPU都有一个对纹理采样器数量的限制,是因为每个采样器都需要在显卡占用一个独立的寄存器,而寄存器的数量是有限的,当超过限制,显卡无法分配更多的寄存器给新的采样器,因此会导致编译错误。2.什么原因导致纹理采样器超出16个?

qq_41884036的博客 4233

PSI5协议技术文档与驱动开发指南

• 供电与数据复用:ECU通过双绞线为传感器提供稳压(典型值5V-11V),同时检测线路电流变化实现数据传输。• 同步信号:ECU发送3.5V电压脉冲(上升沿触发传感器响应),用于时序同步。• 安全气囊:PSI5-P模式实现多碰撞传感器同步采样(响应时间<10ms)• CRC-3(3位):ASIL-B以上功能安全要求(如动力总成传感器)• 奇偶校验(1位):适用于低安全等级场景(如PSI5-P10P模式)• 典型应用:PSI5-P(并行总线)、PSI5-U(通用总线)

u012733413的博客 2867

ShellCode注入

注意点: 1. 不能有全局变量 2. 不能使用常量字符串 ,可以使用这种形式 szTitle = {'a', 'b', 'c', 0}; 3. 不能使用系统调用,比如不能直接使用MessageBox,因为生成的汇编是 Call [0xxxxxx],这个0xxxxx是导入表的地址,注入的程序导入表地址不同而且导入表中不一定有这个函数,可以使用LoadLibrary配合GetProcAddres...

南宫封清的博客 1638

pg lib的信息及产生pg lib的三种方法

pg lib相比basic lib会多几方面pg 信息。除了pg arc(pg pin)以外,liberty还提供电压值,以及pmk cell的power_down_function功能相关信息。1.电压值除了常见的primary pg还有secondary pg和衬底。2.pg arc后端需要去做redhawk功耗分析,需要pg liberty提供pg arc,如果没有pg arc就需要手动去写custom lib代替3.pmk cell的power_down_function。

m0_61544122的博客 595

字符编码的使用和转换

字符编码的使用字符编码主要分两种:MBCS以及 Unicode。 以 C/CC++ 为例,以 char 为单位的数组使用MBCS编码(如 ASCII,GB2312,BIG5),以wchar_t 为单位的数组使用Unicode作为编码。 比如你的程序中使用:char szTitle[] =...

chubaisheng8627的博客 152

Harness Engineering:让Coding Agent真正落地生产

本文将带你系统性地了解如何让Coding Agent真正落地生产,核心是依托(全球领先的持续交付、云成本管理、 feature flagging、安全治理一体化平台),结合企业级AIDD(AI-Driven Development)的工程化实践,构建一套可信赖、可观测、可扩展、可治理的Coding Agent落地体系。核心概念与理论基础:什么是Coding Agent?它和普通的AI代码补全工具(比如GitHub Copilot)有什么区别?什么是Harness Engineering?

移动开发前沿的博客 456

SAP S/4 HANA CO 成本模块实战指南

摘要:SAP S/4HANA CO(管理会计)模块是企业内部成本管理的核心工具。本文系统介绍了CO模块的组织结构(控制范围与会计科目表映射)、基础概念(计划值与预算值)以及6大子模块功能(成本要素、成本中心会计等)。重点解析了各子模块的应用场景与差异,包括成本归集、费用分摊、利润分析和产品成本控制,并对比了利润中心与成本中心、内部订单与销售订单的区别。通过事务代码示例和功能对比表,帮助用户快速掌握SAP CO模块的核心管理逻辑与实施要点。

金牌架构师 1125

4.vc从零开始 -- Win32项目hello world(二)

上文讲了其他的文件,这次就把主用户代码文件testSDK.cpp讲一下。 全局变量、声明、定义 第1-18行: // testSDK.cpp : 定义应用程序的入口点。 //  #include "stdafx.h" #include "testSDK.h"  #define MAX_LOADSTRING 100  // 全局变量: HI

yes2的专栏 1519

YOLOv12改进策略【Neck】| arXiv 2024 MAFPN:多分支辅助特征金字塔网络 | 通过双向辅助融合与异构卷积机制,解决传统PAFPN多尺度特征融合不充分与小目标检测不足问题

本文记录的是利用MAFPN颈部结构改进YOLOv12的目标检测网络模型。通过引入双向辅助融合机制优化特征处理流程,在自底向上路径利用 SAF 模块融合主干浅层特征与颈部输出,并保留浅层空间信息,为小目标检测提供更丰富细节;自顶向下路径通过 AAF 模块建立密集连接,聚合浅层高 / 低分辨率层、同级层及前层特征,均衡各层通道数后实现多向梯度信息交互,增强中 / 大目标特征表达。将其应用到中,解决传统特征金字塔在多尺度信息整合中的不足,提升多尺度目标检测的精度与特征表达的丰富性。Multi-Branch Aux

Limiiiing的博客 1256

字符编码的问题

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

额不食烟火 483

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

各种字符编码问题

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

weixin_30809173的博客 142

廖雪峰Python教程[完整版]

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

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

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

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MySQL-字符编码问题

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

阿文的博客 479

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

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

weixin_39944542的博客 150

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

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

人丑就要多读书的博客 776

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

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

qq_43012298的博客 793

关于字符编码的问题

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

yishengxiao的专栏 284

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

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

xmt1139057136的专栏 1999

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
上一篇: Postgresql数据库日志维护
下一篇: 字符编码问题
pythoner
博客等级 码龄18年 15粉丝 89原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值